Skip to main content
Beta - Contact data is currently in beta. The payload structure may still evolve before general availability. Share your feedback at support@bookingshake.com.

Overview

GET /contacts/{id} returns a single contact (person) by its ID - useful to back-fill a missed contact.* webhook, reconcile your CRM, or re-fetch a person on demand.
Unlike the contact webhook - which omits fields without a value - this endpoint always returns every field with an explicit null when unset (consistent with GET /accounts, GET /invoices and GET /payments). The country field is returned verbatim as entered. account_id is the raw ID of the linked account (or null) - call GET /accounts/{id} to fetch the company details. Custom fields configured for your venue are included, also with explicit null when unset. Timestamps are Unix milliseconds.

Authentication

All requests require a Bearer token (your BookingShake API key):
Authorization: Bearer YOUR_API_KEY

Path Parameters

id
string
required
The contact ID - the id field carried by the contact.created webhook.

Request

curl https://api.bookingshake.io/api/contacts/contact-456 \
  -H "Authorization: Bearer YOUR_API_KEY"
const res = await fetch("https://api.bookingshake.io/api/contacts/contact-456", {
  headers: { Authorization: `Bearer ${process.env.BOOKINGSHAKE_API_KEY}` },
});
const { data: contact } = await res.json();
import os, requests

res = requests.get(
    "https://api.bookingshake.io/api/contacts/contact-456",
    headers={"Authorization": f"Bearer {os.environ['BOOKINGSHAKE_API_KEY']}"},
)
contact = res.json()["data"]
<?php
$ch = curl_init("https://api.bookingshake.io/api/contacts/contact-456");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Authorization: Bearer " . getenv("BOOKINGSHAKE_API_KEY"),
]);
$contact = json_decode(curl_exec($ch), true)["data"];
curl_close($ch);

Response

The contact is returned wrapped in the standard { message, data } envelope.
{
  "message": "success",
  "data": {
    "id": "contact-456",
    "first_name": "John",
    "last_name": "Doe",
    "email": "john.doe@example.com",
    "phone": "+33612345678",
    "landline_phone": "+33145678901",
    "title": "CEO",
    "position": "Head of Events",
    "avatar": null,
    "comments": null,
    "account_id": "account-123",
    "optin_marketing": true,
    "optin_general": false,
    "address_line_1": "10 rue Example",
    "address_line_2": null,
    "postal_code": "75001",
    "city": "Paris",
    "country": "France",
    "created_at": 1731493800000,
    "custom_u1v2w3x4y5": "VIP",
    "custom_z6a7b8c9d0": null
  }
}

Data Fields

FieldTypeDescription
idstringUnique contact ID
first_namestring | nullFirst name
last_namestring | nullLast name
emailstring | nullEmail address
phonestring | nullMobile phone number
landline_phonestring | nullLandline phone number
titlestring | nullContact’s title
positionstring | nullJob position
avatarstring | nullAvatar image URL
commentsstring | nullFree-text notes about the contact
account_idstring | nullID of the account this contact belongs to
optin_marketingboolean | nullMarketing communications opt-in
optin_generalboolean | nullGeneral communications opt-in
address_line_1string | nullAddress
address_line_2string | nullAddress, line 2
postal_codestring | nullPostal code
citystring | nullCity
countrystring | nullCountry, verbatim as entered
created_atnumber | nullCreation timestamp, Unix milliseconds
custom_<uuid>any | nullCustom fields configured for your venue

Errors

StatusMeaning
400Missing/invalid token, or missing contact id
404Contact not found - it does not exist, or belongs to another venue or venues group
429Rate limit exceeded (60 requests/minute)
500Internal server error
A 404 is returned uniformly whenever the contact is outside your scope, so the existence of another venue’s contact is never disclosed.

Next Steps

Contact Events

Receive contact changes in real time via the contact.* webhooks

Get an Account

Fetch the company a contact is attached to