API 1.0.0

Parkoni Channel API

For sales channels that sell an operator’s inventory. Bookings are idempotent on your reference; events arrive as signed webhooks. Errors answer `{ error: { code, message } }` with the codes listed per response.

Channel APIConnector APIOpenAPI 3.1 JSON

Authentication

Authorization: Bearer pzk_<prefix>_<secret>. Keys are shown once and stored hashed.

Idempotency

POST /bookings is idempotent on externalRef: a repeated push returns the same booking.

Webhooks

X-Parkoni-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "t.body">; replay window 300 seconds

Endpoints

Base URL: /api/channel/v1

get/products

Products of linked, approved operators with the rate card valid today

200 Products400 invalid_request, invalid_json401 unauthorized: missing or invalid key403 missing_scope, forbidden, not_a_channel or not_a_connector, operator_not_linked404 Not found429 rate_limited (header Retry-After)500 internal

post/quotes

Availability and price; a sold-out answer is authoritative

200 Quote400 invalid_request, invalid_json401 unauthorized: missing or invalid key403 missing_scope, forbidden, not_a_channel or not_a_connector, operator_not_linked404 product_not_found422 no_rate, invalid_range, rate_plan_not_valid, stay_too_short, stay_too_long, lead_time, beyond_horizon (arrival more than 365 days ahead)429 rate_limited (header Retry-After)500 internal

get/bookings

Bookings of this channel changed since

200 Bookings400 invalid_request, invalid_json, invalid_since401 unauthorized: missing or invalid key403 missing_scope, forbidden, not_a_channel or not_a_connector, operator_not_linked404 Not found429 rate_limited (header Retry-After)500 internal

post/bookings

Create a booking; idempotent on externalRef

200 The same request again: the existing booking for this externalRef201 Created400 invalid_request, invalid_json401 unauthorized: missing or invalid key403 missing_scope, forbidden, not_a_channel, operator_not_linked, sandbox_not_allowed404 product_not_found409 declined_no_capacity, declined_arrival_blocked, price_changed (expectedTotalGrossMinor differs from the current total), idempotency_mismatch (externalRef used with a different request), request_in_progress422 no_rate, invalid_range, rate_plan_not_valid, stay_too_short, stay_too_long, lead_time, beyond_horizon (arrival more than 365 days ahead), vehicle_not_accepted, payment_mode_not_offered429 rate_limited (header Retry-After)500 internal503 checkout_paused

get/bookings/{reference}

One booking with its stay report

200 Booking400 invalid_request, invalid_json401 unauthorized: missing or invalid key403 missing_scope, forbidden, not_a_channel or not_a_connector, operator_not_linked404 booking_not_found429 rate_limited (header Retry-After)500 internal

post/bookings/{reference}/cancel

Cancel; the fee follows the policy snapshot

200 Cancelled booking400 invalid_request, invalid_json401 unauthorized: missing or invalid key403 missing_scope, forbidden, not_a_channel or not_a_connector, operator_not_linked404 booking_not_found409 not_cancellable, cancel_after_arrival (after the booked arrival the no-show rules apply)429 rate_limited (header Retry-After)500 internal

get/deliveries

Your webhook delivery log (last 100)

200 Deliveries400 invalid_request, invalid_json401 unauthorized: missing or invalid key403 missing_scope, forbidden, not_a_channel or not_a_connector, operator_not_linked404 Not found429 rate_limited (header Retry-After)500 internal

post/deliveries/{id}/redeliver

Send a failed or dead-lettered delivery again (needs a writing scope)

200 Queued400 invalid_request, invalid_json401 unauthorized: missing or invalid key403 missing_scope, forbidden, not_a_channel or not_a_connector, operator_not_linked404 delivery_not_found409 not_redeliverable: delivered, still pending or being sent, or its event is past the 30-day retention429 rate_limited (header Retry-After)500 internal

Open data, no key needed

Facts about every airport and port with car parks on Parkoni, rebuilt every 10 minutes, under CC BY 4.0 (attribution: Parkoni, parkoni.com).

  • GET /data/airports.json: every place with car park counts, distances, transfers, dated from-prices and its pages in all languages.
  • GET /data/airports/{CODE}.json: one place (IATA code or UN/LOCODE) with every car park and offer: operator, transfer, distance, cancellation, confirmation, payment, from-prices.
  • GET /{language}/suche?airport={CODE}&from={YYYY-MM-DDTHH:MM}&to={YYYY-MM-DDTHH:MM}&toKind=landing|pickup: the search page with priced offers for those dates (local time of the place; landing = the return flight lands, pickup = you collect the car). For assistants acting on a traveller's request, not for crawling.
  • /llms.txt and /llms-full.txt: the same catalogue for language models. Most pages also have a Markdown version at their address plus .md.

Schemas

PriceLineV1 · StayReportV1 · BookingExchangeV1 · AvailabilityV1 · QuoteV1 · RateCardV1 · PartnerBookingRequestV1 · ApiErrorV1

OpenAPI 3.1 JSON