Skip to main content
POST
Create a price-locked quote

Authorizations

Authorization
string
header
default:sk_test_DEMO0000_replace_with_your_sandbox_key
required

API key authentication. Issued by the Safariat admin or via the partner portal. The secret is shown only once at generation.

Production sk_live_* keys must additionally sign every write request (POST/PUT/DELETE) with the X-Timestamp and X-Signature headers. Sandbox sk_test_* keys are exempt from request signing: X-Signature and X-Timestamp are not required for writes in the sandbox (so the developer-portal "Try it" playground works end to end). The Idempotency-Key header remains required on writes in both environments.

Headers

Idempotency-Key
string
required

Opaque, client-generated string unique per logical operation (a UUID v4 is recommended but any non-blank value up to 255 chars is accepted). Same key + same body = the cached response is returned with the Idempotent-Replayed: true header. Same key + different body = 409 Conflict. Retained for 24 h.

Maximum string length: 255
X-Timestamp
integer<int64>
required

Unix timestamp in seconds at the time the request is issued. Validity window ±5 minutes — beyond that the request is rejected. Required for production sk_live_* keys only; not required for sandbox sk_test_* keys.

X-Signature
string
required

hex(HMAC_SHA256(secret, "{X-Timestamp}\n{METHOD}\n{path}\n{body}")). The path includes the query string. The body is the exact JSON representation sent — any reformatting invalidates the signature. Required for production sk_live_* keys only; not required for sandbox sk_test_* keys.

Pattern: ^[a-f0-9]{64}$

Body

application/json
adventure_slug
string
required
Pattern: ^[a-z0-9-]+$
rate_pack_id
string<uuid>
required
start_date
string<date>
required
rooms
object[]
required
Required array length: 1 - 10 elements
start_time
string | null

Required on an EXPERIENCE whose rate pack exposes start_times (partner.quote.starttime.required otherwise). Optional on a TRIP, whose departure hour is informative. In both cases a value that is not one of the pack start_times is rejected (partner.quote.starttime.not.available). Returned as null for a pack that exposes no start time, flexible packs included.

Pattern: ^[0-2][0-9]:[0-5][0-9]$

Response

Quote created

id
string<uuid>
required
pricing
object
required

Revenue breakdown (locked price; indicative = false, sandbox_surcharge = 0). pricing.amount_due_to_safariat is the amount-match anchor for booking creation.

breakdown
object[]
required

Priced lines making up the quote. travelers is always present; room_supplement appears when the booked room types carry a supplement. The lines sum to the gross price found in pricing.

expires_at
string<date-time>
required

30-minute TTL after creation.

adventure_slug
string
rate_pack_id
string<uuid>
start_date
string<date>
start_time
string | null
rooms
object[]