> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bookingshake.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get a Contact

> Retrieve a single contact (person) by its ID

<Warning>
  **Beta** - Contact data is currently in beta. The payload structure may still evolve before general availability. Share your feedback at [support@bookingshake.com](mailto:support@bookingshake.com).
</Warning>

## 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.

<Note>
  Unlike the [contact webhook](/api-reference/webhooks/contacts) - which **omits** fields without a value - this endpoint always returns every field with an explicit `null` when unset (consistent with [GET /accounts](/api-reference/accounts), [GET /invoices](/api-reference/invoices) and [GET /payments](/api-reference/payments)). The `country` field is returned **verbatim** as entered. `account_id` is the raw ID of the linked [account](/api-reference/accounts) (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**.
</Note>

## Authentication

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

```
Authorization: Bearer YOUR_API_KEY
```

## Path Parameters

<ParamField path="id" type="string" required>
  The contact ID - the `id` field carried by the `contact.created` webhook.
</ParamField>

## Request

<CodeGroup>
  ```bash cURL theme={null}
  curl https://api.bookingshake.io/api/contacts/contact-456 \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```

  ```javascript Node.js theme={null}
  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();
  ```

  ```python Python theme={null}
  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 PHP theme={null}
  <?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);
  ```
</CodeGroup>

## Response

The contact is returned wrapped in the standard `{ message, data }` envelope.

```json theme={null}
{
  "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

| Field             | Type            | Description                                                                                   |
| ----------------- | --------------- | --------------------------------------------------------------------------------------------- |
| `id`              | string          | Unique contact ID                                                                             |
| `first_name`      | string \| null  | First name                                                                                    |
| `last_name`       | string \| null  | Last name                                                                                     |
| `email`           | string \| null  | Email address                                                                                 |
| `phone`           | string \| null  | Mobile phone number                                                                           |
| `landline_phone`  | string \| null  | Landline phone number                                                                         |
| `title`           | string \| null  | Contact's title                                                                               |
| `position`        | string \| null  | Job position                                                                                  |
| `avatar`          | string \| null  | Avatar image URL                                                                              |
| `comments`        | string \| null  | Free-text notes about the contact                                                             |
| `account_id`      | string \| null  | ID of the [account](/api-reference/accounts) this contact belongs to                          |
| `optin_marketing` | boolean \| null | Marketing communications opt-in                                                               |
| `optin_general`   | boolean \| null | General communications opt-in                                                                 |
| `address_line_1`  | string \| null  | Address                                                                                       |
| `address_line_2`  | string \| null  | Address, line 2                                                                               |
| `postal_code`     | string \| null  | Postal code                                                                                   |
| `city`            | string \| null  | City                                                                                          |
| `country`         | string \| null  | Country, verbatim as entered                                                                  |
| `created_at`      | number \| null  | Creation timestamp, Unix milliseconds                                                         |
| `custom_<uuid>`   | any \| null     | [Custom fields](/api-reference/webhooks/introduction#custom-fields) configured for your venue |

## Errors

| Status | Meaning                                                                            |
| ------ | ---------------------------------------------------------------------------------- |
| `400`  | Missing/invalid token, or missing contact id                                       |
| `404`  | Contact not found - it does not exist, or belongs to another venue or venues group |
| `429`  | [Rate limit](/api-reference/rate-limiting) exceeded (60 requests/minute)           |
| `500`  | Internal server error                                                              |

<Note>
  A `404` is returned uniformly whenever the contact is outside your scope, so the existence of another venue's contact is never disclosed.
</Note>

## Next Steps

<CardGroup cols={2}>
  <Card title="Contact Events" icon="user" href="/api-reference/webhooks/contacts">
    Receive contact changes in real time via the contact.\* webhooks
  </Card>

  <Card title="Get an Account" icon="building" href="/api-reference/accounts">
    Fetch the company a contact is attached to
  </Card>
</CardGroup>
