Giligetaway Logo

Giligetaway API v3

Complete guide for the Giligetaway APIs

Note

The Gili Getaway API key can be accessed through the following dashboard: https://giligetaway-widget.my.id/agent/signin

If you need further assistance, contact Giligetaway Team.

Overview
GET
/api/agent-access/search-schedule/v3

Search for available Giligetaway boat schedules and sub-schedules between two destinations on a given date. Supports filtering by seat availability and requires API key authentication for registered agents.

Base URL

https://gili-server.my.id

Authentication

Agent ID + API Key

Response Format

JSON

Query Parameters
ParameterTypeRequiredDescription
fromnumber
Required
Origin port ID. Example: 8 (Serangan, Bali)
tonumber
Required
Destination port ID. Example: 2 (Gili Trawangan)
datestring
Required
Travel date in YYYY-M-D format. Example: 2025-9-1
passengers_totalnumber
Optional
Number of passengers. Filters schedules with sufficient available seats
agent_idnumber
Required
Agent identifier. Required for API key validation
api_keystring
Required
API key assigned to the agent
discount_codestring
Optional
Discount code to apply to net_price calculation

Example Request URL

GET /api/agent-access/search-schedule/v3?from=8&to=2&date=2026-2-9&agent_id=923&api_key=your_api_key&passengers_total=2&discount_code=AGENT10
Destination ID Reference
Available ports and their corresponding IDs
Gili Gede
1
Gili Trawangan
2
Gili Air
3
Bangsal Lombok
5
Gili Meno
6
Nusa Penida
7
Serangan
8
Authentication

This endpoint requires validation of agent_id and api_key.

Invalid Authentication Example

{
  "success": false,
  "message": "Invalid API key"
}
Success Response
When schedules are found
200 OK
{
  "status": "success",
  "data": {
    "schedules": [
      {
        "id": 108,
        "schedule_id": 58,
        "subschedule_id": 108,
        "from": "Serangan, Bali",
        "to": "Gili Trawangan",
        "route_image": "https://ik.imagekit.io/...",
        "price": 760000,
        "seatAvailability": {
          "schedule_id": "N/A",
          "subschedule_id": "N/A",
          "available_seats": 32,
          "date": "2/9/2026",
          "bookedSeatNumbers": ["C1", "C2"]
        },
        "boat_name": "Giligetaway 2",
        "boat": {
          "id": 1,
          "name": "Giligetaway 2",
          "capacity": 40,
          "image": "https://...",
          "seat_layout": {
            "inside_seats": ["B1", "C1", "D1", ...],
            "outside_seats": ["X1", "X2", "X3", "X4"],
            "rooftop_seats": ["R1", "R2", "R3", ...]
          }
        },
        "route_timeline": [
          {
            "type": "departure",
            "location": "Serangan, Bali",
            "time": "09:00:00",
            "action": "Depart from"
          },
          {
            "type": "arrival",
            "location": "Gili Trawangan",
            "time": "12:00:00",
            "action": "Arrive at"
          }
        ],
        "route_description": "09:00:00 Serangan, Bali → 12:00:00 Gili Trawangan",
        "route_steps": [
          {
            "step": 1,
            "from": "Serangan, Bali",
            "departure_time": "09:00:00",
            "to": "Gili Trawangan",
            "arrival_time": "12:00:00",
            "type": "to_destination"
          }
        ],
        "route_summary": "Serangan, Bali → Gili Trawangan",
        "route_type": "direct",
        "stops_count": 2,
        "net_price": 549000,
        "discount_activated": true
      }
    ],
    "passenger_count_requested": 2
  }
}
Response Fields
Explanation of each field in the schedule response
FieldTypeDescription
idnumberUnique identifier (subschedule_id if subschedule, else schedule_id)
schedule_idnumberParent schedule ID
subschedule_idnumber | "N/A"Subschedule ID or "N/A" for main schedule
route_imagestringURL of route map image
pricenumberPublished price per passenger (IDR)
net_pricenumberAgent net price per passenger after commission
discount_activatedbooleanWhether agent discount is applied to net_price
boat_namestringName of the boat
route_typestring"direct" or "transit"
stops_countnumberNumber of stops including departure and arrival
Discount Code in Search
How discount_code affects the search response

How It Works

When you include discount_code in your search request, the API will calculate and return the discounted net_price for each schedule.

Response with Discount Applied

{
  "id": 108,
  "price": 760000,
  "net_price": 549000,
  "discount_activated": true,
  ...
}

Note: discount_activated: true indicates the discount was successfully applied.

Response without Discount

{
  "id": 108,
  "price": 760000,
  "net_price": 610000,
  "discount_activated": false,
  ...
}

Important Notes

  • Discount validation uses the search date parameter
  • If discount is invalid or expired, discount_activated will be false
  • The same discount_code should be used when creating the booking
  • Some discounts may only apply to specific schedules or routes
No Schedules Available
When no schedules match the criteria
200 OK
{
  "status": "success",
  "message": "No schedules available for 2 passengers. All selected schedules are full.",
  "data": {
    "schedules": [],
    "passenger_count_requested": 2,
    "seats_availability_issue": true
  }
}
Authentication Error
When authentication fails
400 Bad Request
or
403 Forbidden
{
  "success": false,
  "message": "agent_id and api_key are required"
}
Important Notes

Capacity Logic

capacity depends on the boost flag:

  • If boost = false: use public_capacity
  • If boost = true: use full capacity

Schedule Validity

Schedules are filtered by validity_start and validity_end. Schedules with validity_end on the request date are excluded.

Response Optimization

bookedSeatNumbers are returned for frontend reference but exclude unnecessary fields like id, availability, and boost for cleaner response.