API

Sections

Theme switcher

Convenience Fees

PT Kereta Api Indonesia is one of the carriers that include a convenience fee as part of the booking. To be sure if any of the carriers you work with have convenience fees please contact your partnership manager.

The convenience fees are included in the prices you get from the /connections/find endpoint, but info about their amount start to be presented in the subsequent endpoints in the flow: /connections/vacancy, /reservations/create, /reservations/confirm, /reservations/{reservation_id} and /bookings/{booking_id}.

It is mandatory to disclose this fee to the users as part of your booking flow, ideally in the check out page.

Convenience Fee Amount

Read the CONV section in the response from /connections/vacancy endpoint. The fee is always presented as an absolut amount in the currency specified in your request.

JSON
"included": [ { "id": "CONV", "type": "fees", "attributes": { "code": "CONV", "name": "Convenience Fee", "component": "Distribusion", "included_in_price": true, "amount": 750000 } } ]

Showing Convenience Fee and Ticket Price

In your checkout page you must clearly identify the convenience fee.

  • Ticket Price = total_price - convenience_fee
  • Convenience Fee = convenience_fee
  • Booking Fee = (added by you, if any)
  • Total Price = total_price

API Workflow

  1. Call the /connections/find endpoint and check the prices normally. These already include the convenience fee, but the response doesn't show the fee amount yet.
  2. In the /connections/vacancy endpoint the prices also include the convenience fee. The section CONV will display the amount of the convenience fee that is already included in the total_price.
  3. All subsequent API responses in the flow will show the total_price including the convenience fee. Besides that the convenience fee amount appears in the /reservations/{reservation_id} and /bookings/{booking_id} endpoints as well.
  4. In the checkout page we recommend you display the convenience fee to the user. At this point, by using the total_price info the fee will be charged from users as part of their payment.

API Examples

Sample Request to /connections/vacancy

HTTP
https://api.demo.distribusion.com/retailers/v4/connections/vacancy?currency=IDR&marketing_carrier=JUNK&departure_station=IDBDOBBA&arrival_station=IDJARGBA&departure_time=2025-03-15T11%3A05&arrival_time=2025-03-15T14%3A12&passengers[][pax]=1&passengers[][type]=PNOS&fare_class=FARE-14&retailer_partner_number=222222

Sample Response from /connections/vacancy

JSON
{ "data": { "id": "JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "vacancies", "attributes": { "vacant": true, "total_price": 20250000, "original_price": 20250000 }, "relationships": { "applied_cards": { "data": [] }, "fees": { "data": [ { "id": "CONV", "type": "fees" } ] }, "ancillary_options": { "data": [] } } }, "jsonapi": { "version": "1.0" }, "meta": { "currency": "IDR" }, "included": [ { "id": "CONV", "type": "fees", "attributes": { "code": "CONV", "name": "Convenience fee", "component": "distribusion", "included_in_price": true, "amount": 750000 } } ]
} }

For more samples responses, check the /connections/vacancy endpoint page.

Sample Request to /reservations/{reservation_id}

HTTP
https://api.demo.distribusion.com/retailers/v4/reservations/RHSHR6SF

Sample Response from /reservations/{reservation_id}

JSON
{ "data": { "id": "RHSHR6SF", "type": "reservations", "attributes": { "total_price": 35750000, "original_price": 35750000, "state": "confirmed", "created_at": "2025-02-24T07:51", "confirmed_at": "2025-02-24T07:56", "cancelled_at": null, "failed_at": null, "processing_started_at": "2025-02-24T07:56", "processing_deadline": null, "expires_at": "2025-02-24T07:58", "terms_version": null, "title": null, "first_name": null, "last_name": null, "email": null, "phone": null, "city": null, "zip_code": null, "country_code": null, "street_and_number": null, "gender": null, "country_of_birth": null, "government_id_type": null, "marketing_carrier_reservation_ids": [ "ZC98DVR-133" ], "agent_id": null, "retailer_booking_number": null }, "relationships": { "booking": { "data": { "id": "5RS9Tj_bwpyCuGfO-kOjHQ", "type": "bookings" } }, "utm_params": { "data": null }, "errors": { "data": [] }, "reservation_passengers": { "data": [ { "id": "R-PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "reservation_passengers" }, { "id": "R-PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "reservation_passengers" } ] }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] }, "custom_fields": { "data": [] } } }, "jsonapi": { "version": "1.0" }, "meta": { "locale": "en", "currency": "IDR" }, "included": [ { "id": "R-PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "reservation_passengers", "attributes": { "first_name": "test1", "last_name": "DT", "serial_code": null, "government_id_type": "passport_id", "nationality": null, "gender": null, "country_of_birth": null, "birthdate": "1996-11-02", "type": "PNOS", "seat_number": null } }, { "id": "R-PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "reservation_passengers", "attributes": { "first_name": "test2", "last_name": "DT", "serial_code": null, "government_id_type": "passport_id", "nationality": null, "gender": null, "country_of_birth": null, "birthdate": "1996-11-20", "type": "PNOS", "seat_number": null } }, { "id": "5RS9Tj_bwpyCuGfO-kOjHQ", "type": "bookings", "attributes": { "departure_time": "2025-03-15T11:05", "arrival_time": "2025-03-15T14:12", "duration": 11220, "title": "mr", "first_name": "test1", "last_name": "DT", "email": "test@test.com", "phone": "+0 123 456 78 90", "city": "Berlin", "zip_code": "13355", "street_and_number": "Wattstrasse 10", "payment_method": "demand_note", "payment_token": null, "payer_id": null, "tax_id": null, "vat_number": null, "business_name": null, "total_price": 35750000, "original_price": 35750000, "marketing_carrier_booking_number": "ZC98DVR", "pax": 2, "flight_number": null, "distribusion_booking_number": "IVXC11", "marketing_carrier_booking_numbers": [ "ZC98DVR" ], "terms_accepted": true, "send_customer_email": true, "retailer_partner_number": "170886", "connection_reference": null, "created_at": "2025-02-24T07:56" }, "relationships": { "fare_class": { "data": { "id": "JUNK-FARE-14", "type": "fare_classes" } }, "outbound_connection": { "data": { "id": "JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "connections" } }, "inbound_connection": { "data": null }, "amended_by": { "data": null }, "result_of_amendment": { "data": null }, "segments": { "data": [ { "id": "JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segments" } ] }, "passengers": { "data": [ { "id": "PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "passengers" }, { "id": "PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "passengers" } ] }, "fees": { "data": [ { "id": "IVXC11-0-CONV", "type": "fees" } ] }, "applied_cards": { "data": [] } } }, { "id": "JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segments", "attributes": { "departure_time": "2025-03-15T11:05", "arrival_time": "2025-03-15T14:12", "original_price": null, "index": 0, "vehicle_number": "PARAHYANGAN DEV (133)", "departure_platform": null, "line": null, "line_prefix": null }, "relationships": { "departure_station": { "data": { "id": "IDBDOBBA", "type": "stations" } }, "arrival_station": { "data": { "id": "IDJARGBA", "type": "stations" } }, "operating_carrier": { "data": { "id": "JUNK", "type": "operating_carriers" } }, "marketing_carrier": { "data": { "id": "JUNK", "type": "marketing_carriers" } }, "vehicle": { "data": { "id": "TRAIN-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "vehicles" } }, "segment_passengers": { "data": [ { "id": "PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segment_passengers" }, { "id": "PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segment_passengers" } ] }, "ancillaries": { "data": [] } } }, { "id": "PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segment_passengers", "attributes": { "seat_number": "EKS-1,4A", "marketing_carrier_passenger_id": null }, "relationships": { "passenger": { "data": { "id": "PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "passengers" } }, "ticket": { "data": null }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] } } }, { "id": "PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segment_passengers", "attributes": { "seat_number": "EKS-1,4B", "marketing_carrier_passenger_id": null }, "relationships": { "passenger": { "data": { "id": "PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "passengers" } }, "ticket": { "data": null }, "applied_cards": { "data": [] }, "ancillaries": { "data": [] } } }, { "id": "PNOS-1-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "passengers", "attributes": { "first_name": "test1", "last_name": "DT", "serial_code": "CONNEC8055ZC98DVR1", "type": "PNOS" } }, { "id": "PNOS-2-JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "passengers", "attributes": { "first_name": "test2", "last_name": "DT", "serial_code": "CONNEC8055ZC98DVR2", "type": "PNOS" } }, { "id": "JUNK-FARE-14", "type": "fare_classes", "attributes": { "code": "FARE-14", "name": "Executive - I", "iata_category": null, "journey_type": "single" }, "relationships": { "post_booking_condition": { "data": null }, "fare_features": { "data": [ { "id": "JUNK-ACON", "type": "fare_features" }, { "id": "JUNK-PSOC", "type": "fare_features" }, { "id": "JUNK-ALRO", "type": "fare_features" }, { "id": "JUNK-RARM", "type": "fare_features" }, { "id": "JUNK-MSYS", "type": "fare_features" }, { "id": "JUNK-TOIL", "type": "fare_features" }, { "id": "JUNK-CCTV", "type": "fare_features" }, { "id": "JUNK-TABN", "type": "fare_features" }, { "id": "JUNK-NREF", "type": "fare_features" } ] }, "ticket_validity_rules": { "data": [ { "id": "JUNK-FARE-14-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules" } ] }, "passenger_group_rules": { "data": [ { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules" }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1", "type": "passenger_group_rules" }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-2", "type": "passenger_group_rules" } ] } } }, { "id": "JUNK-ACON", "type": "fare_features", "attributes": { "code": "ACON", "name": "Air Conditioning", "description": "The vehicle has a cooling ventilation system." } }, { "id": "JUNK-PSOC", "type": "fare_features", "attributes": { "code": "PSOC", "name": "Power Socket", "description": "Power supply is available at every seat." } }, { "id": "JUNK-ALRO", "type": "fare_features", "attributes": { "code": "ALRO", "name": "Additional Leg Room", "description": "The seat has additional leg space." } }, { "id": "JUNK-RARM", "type": "fare_features", "attributes": { "code": "RARM", "name": "Reclining armchairs", "description": "Comfortable armchairs are available on board." } }, { "id": "JUNK-MSYS", "type": "fare_features", "attributes": { "code": "MSYS", "name": "Media System", "description": "A media system is available on board." } }, { "id": "JUNK-TOIL", "type": "fare_features", "attributes": { "code": "TOIL", "name": "Toilet", "description": "A toilet is available on board." } }, { "id": "JUNK-CCTV", "type": "fare_features", "attributes": { "code": "CCTV", "name": "24/7 monitoring room/ CCTV", "description": "24/7 monitoring room/ CCTV" } }, { "id": "JUNK-TABN", "type": "fare_features", "attributes": { "code": "TABN", "name": "Table seat included", "description": "Table seat included" } }, { "id": "JUNK-NREF", "type": "fare_features", "attributes": { "code": "NREF", "name": "Non-refundable", "description": "The ticket cannot be refunded." } }, { "id": "JUNK-FARE-14-TICKET_VALIDITY_RULE-0", "type": "ticket_validity_rules", "attributes": { "rule_type": "outbound", "reference_time_type": "departure_time", "use_type": "once", "offset_type": "minutes", "duration_type": "minutes", "offset": 0, "duration": 0 } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-0", "type": "passenger_group_rules", "attributes": { "rule_type": "passengers_type_requires_passengers_types", "description": "1A-1F" }, "relationships": { "parameters": { "data": [ { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters" }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-0-PARAMETER-1", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1", "type": "passenger_group_rules", "attributes": { "rule_type": "passengers_type_ratio", "description": "1A-1F" }, "relationships": { "parameters": { "data": [ { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1-PARAMETER-0", "type": "passenger_group_rule_parameters" }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1-PARAMETER-1", "type": "passenger_group_rule_parameters" }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1-PARAMETER-2", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-2", "type": "passenger_group_rules", "attributes": { "rule_type": "max_passengers", "description": "max_passenger" }, "relationships": { "parameters": { "data": [ { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-2-PARAMETER-0", "type": "passenger_group_rule_parameters" } ] } } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-0-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "dependent_passengers_types", "value": [ "PINT" ] } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-0-PARAMETER-1", "type": "passenger_group_rule_parameters", "attributes": { "name": "required_passengers_types", "value": [ "PNOS" ] } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "ratio_from_types", "value": [ "PINT" ] } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1-PARAMETER-1", "type": "passenger_group_rule_parameters", "attributes": { "name": "ratio_to_types", "value": [ "PNOS" ] } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-1-PARAMETER-2", "type": "passenger_group_rule_parameters", "attributes": { "name": "ratio", "value": 1 } }, { "id": "JUNK-FARE-14-PASSENGER_GROUP_RULE-2-PARAMETER-0", "type": "passenger_group_rule_parameters", "attributes": { "name": "passengers_limit", "value": 8 } }, { "id": "IVXC11-0-CONV", "type": "fees", "attributes": { "code": "CONV", "name": "Convenience fee", "component": "distribusion", "included_in_price": true, "amount": 750000 } }, { "id": "JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12", "type": "connections", "attributes": { "departure_time": "2025-03-15T11:05", "arrival_time": "2025-03-15T14:12" }, "relationships": { "departure_station": { "data": { "id": "IDBDOBBA", "type": "stations" } }, "arrival_station": { "data": { "id": "IDJARGBA", "type": "stations" } }, "marketing_carrier": { "data": { "id": "JUNK", "type": "marketing_carriers" } }, "segments": { "data": [ { "id": "JUNK-IDBDOBBA-IDJARGBA-2025-03-15T11:05-2025-03-15T14:12-0", "type": "segments" } ] }, "fees": { "data": [] } } } ] }

For more samples responses, check the /reservations/{reservation_id} endpoint page.

Was this section helpful?

What made this section unhelpful for you?

On this page
  • Convenience Fees
View as Markdown

Ask an AI

Open in ChatGPTOpen in ClaudeOpen in Perplexity

Code with AI

Open in Copilot