Recipes

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

Common jobs, start to finish. Each one is a handful of calls; the 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": "[email protected]"}'
# → { "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).
  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": "[email protected]" }],
    "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: 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.