> For the complete documentation index, see [llms.txt](https://docs.tiny.plus/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tiny.plus/api/endpoints/meetings.md).

# Meetings

Meetings live at `/v2/meetings`. They support every request on the [Records](/api/endpoints/records.md) page: list, get, history, create, update, delete and search.

## Creating a meeting

```bash
curl -X POST "https://api.tiny.plus/v2/meetings" \
  -H "Authorization: Bearer {{user_access_token}}" \
  -H "Content-Type: application/json" \
  -d '{
        "name": "Site visit",
        "meeting_date": "2026-10-08 23:00:00",
        "meeting_date_end": "2026-10-09 00:00:00",
        "meeting_location": "Site office",
        "record_status": "planned",
        "primary_related": "1237",
        "related_selector": ["1231", "1241"]
      }'
```

```javascript
{
    "id": "161084"
}
```

* Send `name`, `meeting_date` and `meeting_date_end`. `record_status` is `planned`, `held` or `cancelled`, and a meeting sent without one is `planned`.
* Send the start and end times in UTC. They come back in UTC.
* `primary_related` is the company, contact or project the meeting is with. tiny+ links the meeting to it, which is how the record's Meetings & Tasks panel finds it.
* To add the team members and contacts who are coming, link them with `related_selector`. See [Linking records](/api/concepts/linking.md#linking-other-records).

A day after a planned meeting ends, tiny+ marks it as held.

## A record's meetings

A company, contact or project page in tiny+ lists every meeting linked to the record, whichever side the link was made from: the meetings added from that page, and the ones the record was invited to. [`linked_to`](/api/concepts/listing.md#records-linked-to-another-record) finds the same meetings:

```bash
curl "https://api.tiny.plus/v2/meetings?linked_to=51905&record_status=planned" \
  -H "Authorization: Bearer {{user_access_token}}"
```

* The page lists `planned` meetings with the open tasks, and `held` ones with the completed tasks. It leaves out `cancelled` ones. A `record_status` filter takes one status, so ask for each.
* `primary_related={id}` finds only the meetings added from the record, not the ones it was invited to.
* A contact's meetings aren't listed on their company.

## Fields

| Field              | Label in tiny+ | Type      | Notes                                                                          | Editable |
| ------------------ | -------------- | --------- | ------------------------------------------------------------------------------ | -------- |
| `meeting_date`     | Meeting Time   | Date-time | Required. In UTC.                                                              | Yes      |
| `meeting_date_end` | End Time       | Date-time | Required. In UTC.                                                              | Yes      |
| `meeting_location` | Location       | Text      | Where the meeting is, as text.                                                 | Yes      |
| `name`             | Subject        | Text      | Required. Up to 200 characters.                                                | Yes      |
| `primary_related`  | Meeting With   | Record id | The company, contact or project the meeting is with.                           | Yes      |
| `record_status`    | Meeting Status | Option    | `planned`, `held` or `cancelled`. A new meeting sent without one is `planned`. | Yes      |
