Add the booking contact
POST/v1/trips/{tripId}/contact
Makes a person the trip's booking contact (the one who books and pays; they need not travel), as the contact panel's Invite does: finds or creates their traveler account, makes them the booking's holder and stores the contact details you send. If the trip is already reservada they are emailed their app access; otherwise they are told when it gets there. 409 contact_exists if the trip has a contact — change it with PATCH. Undo with DELETE /trips/{tripId}/contact.
Permissions: travelers:write · Kind: write · Cost: 1 unit · MCP tool add_trip_contact
Undo with Remove the booking contact.
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
tripId |
uuid | yes |
Body
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | null | ||
email |
yes | The contact's email — their app access goes here. max 200 chars | |
phone |
string | null | ||
address |
object | null | ||
address.line1 |
string | null | yes | |
address.line2 |
string | null | yes | |
address.postalCode |
string | null | yes | |
address.city |
string | null | yes | |
address.region |
string | null | yes | |
address.country |
string | null | yes | |
docType |
"dni" | "nie" | "passport" | "other" | null | ||
docNumber |
string | null | ||
docCountry |
string | null | ||
taxId |
string | null |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
object |
"trip_contact" | yes | |
tripId |
uuid | yes | |
name |
string | null | yes | |
email |
string | null | yes | |
phone |
string | null | yes | |
address |
object | null | yes | |
address.line1 |
string | null | yes | |
address.line2 |
string | null | yes | |
address.postalCode |
string | null | yes | |
address.city |
string | null | yes | |
address.region |
string | null | yes | |
address.country |
string | null | yes | |
docType |
"dni" | "nie" | "passport" | "other" | null | yes | |
docNumber |
string | null | yes | |
docCountry |
string | null | yes | |
taxId |
string | null | yes | |
account |
object | yes | |
account.userId |
uuid | yes | |
account.email |
string | null | yes | |
account.name |
string | null | yes | |
access |
"invited" | "queued" | "failed" | "no_email" | "not_yet" | null | yes | |
accessOpenedAt |
string | null | yes |
Errors
Errors are problem details. Besides the refusals described above, any call like this one can return:
invalid_request— Invalid requestunauthorized— Missing or invalid API keyinsufficient_scope— Missing permissionrate_limited— Rate limit reachednot_found— Not foundidempotency_key_reused— Idempotency-Key reusedrequest_in_progress— Request in progress