# Recipes

> Common jobs, start to finish: a customer and a deal, reacting to a win, tickets, meetings, syncing.

- Canonical page: https://synconone.com/docs/api-recipes
- Section: Developers
- Updated: 2026-10-22

Common jobs, start to finish. Each one is a handful of calls; the [reference](https://synconone.com/docs/api-reference) has every field.

## Add a customer and open a deal

```bash
# 1. the customer (people:write)
curl -X POST https://synconone.com/api/v1/people -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" -H "Idempotency-Key: order-1042-customer" \
  -d '{"display_name": "Emily Carter", "email": "emily@example.com"}'
# → { "data": { "id": "pr_…" } }

# 2. the pipelines, each with its stage ids (pipelines:read)
curl https://synconone.com/api/v1/pipelines -H "Authorization: Bearer $KEY"

# 3. the deal (opportunities:write)
curl -X POST https://synconone.com/api/v1/opportunities -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" -H "Idempotency-Key: order-1042-deal" \
  -d '{"name": "Annual plan", "person": "pr_…", "stage": "STAGE_ID", "amount": 1200}'
```

## React the moment a deal is won

1. Subscribe to `opportunity.won` ([Webhooks](https://synconone.com/docs/webhooks)).
2. Verify the signature, then read the deal with `GET https://synconone.com/api/v1/opportunities/{data.publicId}`.
3. Do your work, and answer `200` quickly. Do slow work after you have answered.

## Open a ticket and resolve it

```bash
curl -X POST https://synconone.com/api/v1/tickets -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"subject": "Invoice shows the wrong ABN", "person": "pr_…", "priority": "high"}'
# → { "data": { "id": "1042", "number": 1042, "status": "new" } }

curl -X PATCH https://synconone.com/api/v1/tickets/1042 -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" -d '{"status": "resolved"}'
```

A ticket can only move along its lifecycle. A move it cannot make answers `409`. Tickets are closed, never deleted.

## Schedule a meeting

```bash
curl -X POST https://synconone.com/api/v1/meetings -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Quarterly review",
    "starts_at": "2026-11-12T10:00:00+11:00",
    "duration_minutes": 45,
    "time_zone": "Australia/Sydney",
    "person": "pr_…",
    "attendees": [{ "email": "emily@example.com" }],
    "notify": false
  }'
```

With `notify` left on, the meeting goes on the owner's connected calendar and the attendees are invited. Set it to `false` to save it without telling anyone. The response's `notice` says who was told.

## Answer a live chat

See [The live chat inbox](https://synconone.com/docs/api-live-chat): join the conversation, reply, and hand it back.

## Keep another system in step

1. Do a first full read of the list, paging with `cursor`, and remember the newest `updated_at`.
2. Subscribe to `record.created`, `record.updated` and `record.deleted` and apply each change as it arrives.
3. On a schedule, and after any outage, read `?sort=-updated_at&updated_since=…` to catch anything a delivery missed.
