7Transfers / Reseller API

Receive transfer reservations
from your agency.

Quote 7Transfers fares, create a reservation, retrieve its operational status and cancel it using your agency's reference.

Production access is enabled per partner. A quote-only API key cannot create or cancel reservations. Complete technical validation and agree commercial terms before activation. Use the isolated sandbox for fictitious test reservations.

Access and settlement

Base path: /api/reseller on the host agreed with 7Transfers. Use HTTPS and the dedicated production key issued to your agency. It is different from your sandbox key.

Accept: application/json
Content-Type: application/json
Authorization: Bearer {production_api_key}

X-Api-Key: {production_api_key} is also supported. There is no API username or password. Keep keys on your server. Do not put them in URLs, public documentation or browser JavaScript.

The agency sells the transfer and sends the reservation at the quoted 7Transfers fare. A reservation creates an outstanding agency invoice entry. This API does not charge a passenger card, request a new passenger payment, or mark an agency invoice as paid. No payment credentials are accepted. Payment and settlement dates are agreed separately.

1. Obtain a bookable quote

POST /api/reseller/quote

{
  "pickup_address": "Malaga Airport",
  "dropoff_address": "Marbella",
  "date": "2026-12-15",
  "time": "10:30",
  "timezone": "Europe/Madrid",
  "passengers": 4
}

Use local pickup date and time and its IANA timezone. Supply a passenger count from 1 to 50. Addresses are strings of up to 500 characters. Choose a future date; the example date is illustrative. API clients cannot override the pricing engine's current clock.

For partners with reservation access, supplying timezone adds quote_id, expires_at, sandbox: false and the cancellation policy to the existing price response. Save the quote ID and choose a vehicle from the returned array. The quote expires after 15 minutes.

Vehicle records include id, name, price, passenger capacity and luggage capacity. Currency is returned separately. Prices are the public sale fares for the serving 7Transfers website. An empty list, null/zero fare or manual-quote result cannot be booked automatically. Price quotes do not reserve a specific driver.

Existing quote-only clients, or requests without a timezone, retain the price-only response. They do not receive a bookable quote ID.

2. Create a reservation

POST /api/reseller/bookings

{
  "external_id": "AGENCY-RESERVATION-001",
  "quote_id": "{UUID returned by step 1}",
  "vehicle_id": 1,
  "passenger": {
    "name": "Example Passenger",
    "phone": "+12025550100"
  },
  "luggage": 2,
  "hand_luggage": 1,
  "flight_number": "EX123",
  "notes": "Example pickup instructions"
}

Required: unique external_id (max 120 characters), your own quote ID, vehicle ID, passenger name (max 255), phone (max 50), luggage and hand-luggage counts. Optional: passenger email, flight number (max 50), notes (max 500). Passenger and luggage counts must fit the quoted vehicle. Do not send a price override, payment details, status, site ID or driver/fleet assignment.

HTTP 201 returns id (API reservation UUID), your external_id, our reference, quote_id, status, trip, timezone, vehicle, price, currency and cancellation policy. Initial status is normally pending: the reservation is registered for operations and the driver is not yet assigned. It does not mean a named driver has accepted it.

The price is taken from the saved quote. Reusing the same external reference with identical details returns the same reservation with HTTP 200, including after quote expiry or cancellation. Changing the details while reusing that reference returns HTTP 409. Omitted and null optional fields are equivalent. Store the returned API UUID for subsequent calls.

Each reservation represents one transfer leg. Book a return leg as a separate quote and reservation with its own external reference.

3. Retrieve a reservation

GET /api/reseller/bookings/{id}

Use the API UUID returned when creating the reservation. HTTP 200 returns reservation details and its current operational status. Only reservations belonging to your agency and the issuing host's tenant/site can be retrieved. Unrelated reservations return HTTP 404.

Status values include pending, requested, assigned, accepted, onroute, arrived, onboard, completed, noshow, canceled and paid_cancellation. Other operational values may be returned; do not treat unknown states as a completed transfer.

4. Cancel a reservation

POST /api/reseller/bookings/{id}/cancel with JSON {}.

Time remaining to pickupPenaltyStatus
More than 24 hours0%canceled
24 hours or less100% of the quoted farepaid_cancellation

The exact 24-hour boundary is chargeable. Calculation uses the pickup timezone and the current pickup time in operations if it has been edited. HTTP 200 includes cancellation_fee in the reservation currency. Repeating a cancellation returns the original result and does not add another fee.

paid_cancellation means the full fare remains due from the agency; it does not mean money has been collected. No card is charged by this request. Cancellation is refused with HTTP 409 once the passenger is onboard, the transfer is completed, or the reservation is in another terminal state. Supplier cancellation notifications use the normal operational flow.

5. Track the driver on a map

GET /api/reseller/bookings/{id}/tracking

Use the same reservation UUID and production key. Reservation access must be enabled. Only your agency's reservation on the issuing tenant/site can be tracked. Poll no faster than once every 5 seconds, and respect the API rate limit. Responses are not cacheable.

{
  "id": "{reservation UUID}",
  "external_id": "AGENCY-RESERVATION-001",
  "sandbox": false,
  "status": "onroute",
  "tracking_status": "driver_departed_to_pickup",
  "tracking": {
    "available": true,
    "reason": null,
    "position": {
      "latitude": 36.6751,
      "longitude": -4.4991,
      "bearing": 45,
      "speed": 10,
      "accuracy": 5
    },
    "updated_at": "2026-10-23T12:00:00+00:00",
    "age_seconds": 5,
    "is_stale": false,
    "poll_interval_seconds": 5
  }
}

The example coordinates and timestamp are illustrative. Plot latitude/longitude on your map only while tracking.available is true. Bearing is degrees, speed is metres per second and accuracy is metres. Optional measurements can be null. updated_at is the driver's GPS timestamp in UTC, not the time of this HTTP request.

Coordinates are exposed only during onroute, arrived or onboard, from 2 hours before to 24 hours after pickup. The assigned driver must have exactly one active trip in the tenant, matching this reservation. A new GPS fix is required after a reservation status or assignment edit. Driver names, contact details, internal IDs and private realtime channels are not returned.

Signals older than 60 seconds return available: false, is_stale: true, reason: "stale_location", the last update time/age and position: null. Do not display an outdated marker as live.

Other unavailable reasons are trip_not_active, outside_tracking_window, no_driver, ambiguous_active_trip, no_location, invalid_timestamp and awaiting_location_update. An unavailable signal returns HTTP 200 with a null position; an unrelated or unknown reservation returns HTTP 404.

Operational statetracking_status
onroutedriver_departed_to_pickup
arriveddriver_arrived_at_pickup
onboarddriver_departed_to_dropoff
completeddriver_arrived_at_dropoff (coordinates hidden)

Other states have a null tracking_status. Once a trip ends or is canceled, GPS is hidden. elapsed_seconds is a sandbox simulation control and is rejected by this production endpoint.

Errors and retries

Send Accept: application/json. Errors include a message; input validation errors also include errors.

HTTPMeaning
401Missing, invalid or sandbox key.
403Inactive key or reservation access not enabled.
404Quote or reservation does not belong to this agency/host or does not exist.
409Conflicting external reference, fare changed during creation, or cancellation no longer permitted.
410Quote expired. Request a new quote for a new reservation.
422Invalid input, unavailable vehicle, capacity exceeded, past pickup or failed price quotation.
429Rate limit exceeded. Respect the Retry-After response header.
500Unexpected failure. Retry with the same external reference; do not generate a new reference blindly.

Scope and technical validation

Supported: quotations, single-leg reservation creation, current status retrieval, cancellation and driver GPS polling. Reservation changes and returns must not be sent as changes to an existing external reference. Contact operations for modifications.

Driver GPS depends on the assigned driver/fleet supplying valid updates. This API does not guarantee uninterrupted GPS for every supplier. Mozio driver/vehicle registration and outbound live-tracking webhooks are separate integrations; no updates are pushed to Mozio by this polling endpoint. Those webhooks require credentials and provider identification issued by Mozio.

Integration contact: dev@7transfers.com. Complete the mandatory sandbox certification checklist and obtain written technical approval before requesting production activation. Production access is enabled separately after commercial onboarding.

7Transfers · Reseller reservations · Version 1.1 · 23 October 2026