{"ok":true,"openapi":"3.1.0","info":{"title":"Kylosys API","version":"1","summary":"The API the Kylosys app itself runs on: tickets, contacts, projects, phone, inbox and the workspace around them.","description":"Kylosys is a workspace — customers, tickets, projects, a phone system, an inbox — and this is\nthe same API its own app runs on. A business that builds something of its own keeps its people, its\nsupport and its records here rather than building a second system beside it.\n\n## Two credentials, one workspace\n\nSend an API key, minted in the workspace's own account area:\n\n    Authorization: Bearer ky_live_…\n    Authorization: Bearer ky_test_…      # the same key, minted on a preview host\n\nOr send the session cookie the app itself uses, if the caller *is* the app. A key resolves to one\nworkspace and to no person; the cookie resolves to the workspace the person is currently standing in.\n**An `Authorization` header is read first**: a valid key makes any cookie irrelevant, and a malformed\nheader is refused even when a good cookie is present, so send one or the other.\n\n## Where it lives\n\nEvery path below is relative to a base URL, and there are three that answer:\n\n    https://api.kylosys.com/v1        # the API's own host — this is the address to publish\n    https://api.kylosys.com/api/v1    # the same router, under the app's own prefix\n    https://kylosys.com/api/v1        # the app's host, for a same-origin caller\n\nThe document names the prefix it was fetched on, so a client that reads it from one of these is never\nsent to an unadvertised second shape of the same API. `/v1` on the app's own host answers too, and\nexists only so that a base URL copied between the two hosts cannot quietly 404.\n\n## Versioning\n\nThe version is in the path and nowhere else: no header, no `Accept` negotiation, nothing to\ncompare. `GET /ping` reports the version that answered. Additive changes — a new field, a new route,\na new optional parameter — land in place without a word; a change that would break a working client\nmeans `/v2`, and this one keeps answering.\n\n## The envelope\n\nSuccess is `{\"ok\": true, …}`; failure is `{\"ok\": false, \"error\": {\"code\", \"message\", …}}`, and\nnever both. Branch on `code`, show `message`. `422` carries `error.fields` naming what was\nrefused and why.\n\n## Scopes, and the three kinds of key\n\nA key is minted as one of three things, and that word is one of three rather than a list of scopes you\nwrite: a **read** key (`read`), a **read and write** key (`read,write`, the default), or a\n**publishable** key (`ky_pub_…`) — one meant to be seen by anyone who views a page's source.\n\n`write` is enforced in one place, above every resource: a read-only key may make `GET` requests and\nis refused every other method with `403 read_only`. There are no finer scopes yet — a read-only key\nreads everything the workspace can see, including `GET /contacts/export`.\n\n**A publishable key is narrow on purpose, and both restrictions live on the server rather than in the\npage.** It may only be used from the origins its workspace named, and a request from anywhere else is\nrefused `403 origin_not_allowed` — including a request with no `Origin` header at all, because that\nis not a page. A browser sends the whole origin, so an entry is `https://example.com` or\n`http://localhost:5173`, and `https://*.example.com` means that domain and everything under it. It\nmay also only `POST` to three routes — `/tickets`, `/contacts` and `/companies` — and everything\nelse, every `GET` included, answers `403 intake_only`. It is limited like every other key; the\nnumbers are in \"Rate limits\" below, and the publishable ones are the same as they have always been.\n\nIt may travel in a query string — `?key=ky_pub_…` — because a plain HTML form cannot set a header.\nIt is the only key allowed to: a `ky_live_` or `ky_test_` secret in a URL answers `401\nkey_in_url`, since URLs are logged, kept in browser history and pasted into support tickets.\n\n## Modules, and the switches on them\n\nEach module — Phone, Inbox, CRM, Helpdesk, Projects, Payments, Calendar, Assistant, Branding — is\neither available to a workspace or not, and a route whose module is switched off answers `403\nsuite_disabled` with `error.suite` naming it. Availability is the operator's decision; a workspace\nhiding a module from its own rail refuses nothing, so a hidden module's records are still readable\nhere. Three readings are deliberately behind no switch at all: `GET /summary`, `GET /credits`,\n`GET /settings` and `GET /team` answer for any workspace, so a client can always ask what a\nworkspace is rather than being refused the question.\n\n## Paging and filtering\n\n`limit` is 1–500 and defaults to 50; `offset` skips. Both are honoured by the routes that take\nthem, and a route that caps lower says so in its own description. There is no cursor paging: page by\nraising `offset`. Filters are query parameters and are listed per route below.\n\n## Retrying safely\n\nA write can be retried without making a second record. Send an `Idempotency-Key` header — any string up\nto 200 characters; a UUID is the usual choice — and the API remembers the answer for 24\nhours. A retry carrying the same key **and the same request** is handed that answer back instead of\nbeing performed, and the answer says so with `Idempotency-Replayed: true`. This is the header for a\nsocket that timed out, a queue that delivered twice, or a button somebody pressed twice:\n\n```bash\ncurl -X POST https://api.kylosys.com/v1/tickets \\\n  -H \"Authorization: Bearer $KYLOSYS_KEY\" \\\n  -H \"Idempotency-Key: 8f14e45f-ea6b-4c1f-9a1e-2f3b4c5d6e7f\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"subject\":\"Printer is on fire\",\"priority\":\"urgent\"}'\n```\n\nThree things can come back, and `error.code` says which:\n\n| What happened | Answer |\n|---|---|\n| The key was already used for a **different** request — another path, or a body that is not byte-for-byte the same | `409 idempotency_conflict` |\n| A request with that key is **still running** | `409 request_in_progress` |\n| The key is empty, or longer than 200 characters | `400 invalid_idempotency_key` |\n\nA key names one request; it is not a cache, which is why a second, different request under the same key\nis refused rather than answered from the first. So a retry must resend the request it already built,\nbody included and byte for byte — a body re-serialised differently is a different request, and guessing\nwhich one the caller meant would be worse than saying so.\n\nOnly a **successful** write is remembered. A refusal the caller can fix — `422 validation`,\n`403`, `429` — releases the key, so the corrected request goes in as a new attempt under the same key\nrather than being answered with the old refusal. The key belongs to the credential that sent it: two\nkeys, or a key and a session, never see each other's answers, and no credential is ever stored.\n\nNothing changes for a client that does not send the header: no key is claimed, nothing is written and\nthe request is performed exactly as it was before this existed. `GET` is never guarded — there is\nnothing to do twice — and neither is a request with no credential, which is about to be refused anyway.\nA replay is answered from the remembered row before the write path is entered, so it does not count\nagainst a publishable key's own rate limit: a receipt is being read, not a request being made.\n\n## Rate limits\n\nEvery key is limited, per key, over a fixed window — and the limit counts every request that carries\nthe key, including one refused for its scope or for a route it may not use, because a limit on\nsuccessful calls is not a limit on work. The single refusal that is not counted is a publishable key\nused from an origin it does not name, which is decided before the key is counted.\n\n| Kind of key | Requests per window | Window |\n|---|---|---|\n| `ky_live_` / `ky_test_` — a secret key | 1200 | 10 minutes |\n| `ky_pub_live_` / `ky_pub_test_` — a publishable key | 60 | 10 minutes |\n\nThe ceiling belongs to the key's own row rather than to its kind: one key can be given its own limit,\nwhich is a column and therefore a message to us rather than something a request can ask for — nothing\na caller sends can raise it. `api_keys.rate_limit` and `api_keys.rate_window_seconds` are that\ncolumn, empty for every key that has never been given one. A **signed-in session is not counted at\nall**, so this cannot get in the way of the workspace's own screens; it is a limit on keys.\n`GET /me` reports which of the two the request came in on.\n\nEvery answer to a request that carried a key carries the three numbers a client paces itself by, so\nnobody has to be refused in order to learn where they stand — and they are on a refusal too:\n\n| Header | What it is |\n|---|---|\n| `RateLimit-Limit` | How many requests the window allows. |\n| `RateLimit-Remaining` | How many are left in it, this request counted. |\n| `RateLimit-Reset` | When the window ends, as a Unix timestamp in seconds. |\n\nOver the limit the answer is `429 rate_limited`, with `Retry-After` in seconds beside the three\nheaders, and the message names both the limit and the wait. It is decided before the route is reached,\nso a request refused for its limit never also writes. The window is fixed rather than sliding: the next\none begins with the first request after this one ends. A few routes carry a second limit of their own\non top of the key's, per workspace — `POST /email/test`, `POST /calendar/sync` and `POST /ai/chat`\n— and a refusal there is the same `429 rate_limited`.\n\n## Events you can receive\n\nRegister a URL with `POST /webhooks` and every write this API makes is POSTed to it, signed. The\nevents that exist are exactly these — **ping**, **ticket.created**, **ticket.updated**, **contact.created**, **contact.updated**, **company.created**, **company.updated**, **deal.created** — and a route that is not\nin that list is silent on purpose: a new route does not start notifying anybody until we decide it\nshould, and the list above is generated from the same constant the router emits from.\n\nA delivery is one POST to your URL with `Content-Type: application/json` and the body:\n\n```json\n{\n  \"event\": \"ticket.created\",\n  \"created\": \"2026-10-01T12:00:00.000Z\",\n  \"workspace\": \"the business id\",\n  \"api_version\": 1,\n  \"data\": { \"…the same object the route itself answers with…\" }\n}\n```\n\n`data` is the resource as the operation you called returns it — not a summary invented for the\nevent, and not a diff — so a receiver parses one shape for both. Three headers come with it:\n\n| Header | What it is |\n|---|---|\n| `x-kylosys-signature` | `t=<unix seconds>,v1=<hmac sha256 hex>`, computed over `<t>.<the raw body>` with your endpoint's secret. Verify over the bytes you received, not over a re-serialised object: re-encoding JSON changes them. |\n| `X-Kylosys-Event` | The event name, so a receiver can route without parsing. |\n| `X-Kylosys-Delivery` | `whd_…`, this delivery's own id. It is stable across retries — use it to ignore a repeat. |\n\n**Answer 2xx and it is done.** Anything else — a 500, a timeout, a refused connection — is recorded\nagainst the delivery and retried after 1m, 5m, 30m, 2h, 6h, six attempts in all, and the first attempt is\nimmediate. Nothing is retried for ever and nothing is silently dropped: every attempt is in\n`GET /webhooks/{id}/deliveries` with the status it got and the first bytes of what your server said.\nAfter 20 failures in a row the endpoint is switched off — `active` goes false and\n`disabledReason` says why — because a URL that has been dead for a day is not worth a request per\nwrite; `PATCH {active:true}` turns it back on and resets the count. Logs are kept 30 days.\n\n**A webhook is a notification about a write, never part of it.** A receiver that is slow, down or\nanswering nonsense cannot fail, slow or change the call that triggered it — the delivery is made\nafter the answer is sent. Two consequences worth knowing: an event is *at least once*, so a receiver\nshould treat `X-Kylosys-Delivery` as its idempotency key; and this platform has no scheduler, which\nmeans retries ride on the workspace's own traffic (three due deliveries behind every write) and on\n`POST /webhooks/dispatch`. A workspace that stops calling the API entirely keeps a pending delivery\npending until it comes back. Polling, or asking about a window, is still the way to reconcile.\n\n## What is not here yet\n\nStated plainly, because a developer should find it in the document rather than in production:\n\n- **No request-body schemas.** A write takes JSON, and a body the server cannot use is refused with\n  `422 validation` and `error.fields` naming each field and why -- but the fields a route\n  accepts are written out in that operation's own notes rather than as a schema, so a generated\n  client cannot type them for you. Response schemas are named on every operation.\n\n## Doors outside this API\n\nThese are not part of the key surface, and each says who it is for:\n\n| Path | Who calls it |\n|---|---|\n| `POST /api/payments/webhook` | The payment provider. Signed over the raw body; no credential of yours. |\n| `POST /api/email/inbound` | Cloudflare's mail router, with an ingest key. |\n| `POST /api/phone/{voice,agent,message,events,recording,charges,softphone,hold}` | The phone provider's webhooks, signature-checked when a connection holds an account secret. |\n| `GET /api/logo/{businessId}` | Anybody: the rendered workspace mark, with no credential. |\n| `GET /api/phone/audio/{kind}/{hash}.mp3` | Anybody: greeting audio, addressed by content hash. |\n| `GET /api/auth/meta` | Anybody: the countries, trades and lists the sign-up form is built from. |\n| `/api/account/*` | The signed-in app only, session-cookie authenticated. Minting and revoking keys lives here (`POST /api/account/keys`). |\n| `/api/v1/admin/*` | The operator console only: same-origin, session-only, no CORS, and not described by this document. |\n\n## Caching\n\nEvery answer here is `Cache-Control: no-store` and no answer is ever served from a cache. `GET\n/phone/recording/{callSid}` and `GET /email-attachment/{id}` return bytes rather than JSON, and\n`GET /contacts/export` returns `text/csv`.\n\n## Cross-origin\n\n`/api/v1` answers `Access-Control-Allow-Origin: *` with a preflight handled at `OPTIONS` and\n`max-age 86400`, so a server-to-server integration and a same-origin app both work. Because the\norigin is `*`, **an API key in browser JavaScript is readable by any page that can reach it** —\nkeep keys on a server."},"servers":[{"url":"https://api.kylosys.com/api/v1","description":"The app's own host"}],"tags":[{"name":"Core","description":"The key itself, the workspace it belongs to, and the workspace-wide readings."},{"name":"Helpdesk","description":"Tickets, their messages, the desk's policies and its saved replies."},{"name":"CRM","description":"Contacts, companies, the pipeline, tasks, saved views and custom fields."},{"name":"Projects","description":"Projects, their boards, and the work on them."},{"name":"Messaging","description":"Texts, the conversations they arrive in, and the trays."},{"name":"Phone","description":"Lines, extensions, the call log, voicemail, greetings and the softphone's credential."},{"name":"Inbox","description":"The workspace's own mail address, its threads and its attachments."},{"name":"Settings","description":"What the workspace has set, area by area."},{"name":"Assistant","description":"The assistant's tools, and running one without a model."},{"name":"Branding","description":"The workspace's palettes and the design behind its mark."},{"name":"Calendar","description":"Entries, and the calendars they are read from."}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"An API key from the workspace's account area: `Authorization: Bearer ky_live_…`. Send it from a server."},"session":{"type":"apiKey","in":"cookie","name":"ky_session","description":"The signed-in session cookie the app itself uses. A key in the `Authorization` header is read first and makes the cookie irrelevant."}},"schemas":{"Success":{"type":"object","required":["ok"],"properties":{"ok":{"const":true,"description":"Always `true` on a success. An error answers `ok: false` with an `error` object instead, and never both."}},"additionalProperties":true,"description":"Every successful answer is this envelope with the route's own keys beside `ok`. Objects carry more keys than the named schemas list; a client should ignore what it does not know."},"Error":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"A stable, machine-readable reason. Codes in use: `unauthorized`, `missing_key`, `invalid_key`, `expired_key`, `revoked_key`, `read_only`, `suite_disabled`, `not_allowed`, `not_found`, `validation`, `rate_limited`, `conflict`, `server_error`."},"message":{"type":"string","description":"A sentence for a person. It is written to be shown, but a client should branch on `code`."},"fields":{"type":"object","description":"Present with `validation`: the field names that were refused, and why.","additionalProperties":true},"suite":{"type":"string","description":"Present with `suite_disabled`: which module is switched off."}},"additionalProperties":true}},"additionalProperties":true},"Me":{"type":"object","properties":{"business":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"additionalProperties":true},"user":{"type":["object","null"],"description":"`null` for an API key: a key belongs to a workspace and to no person."},"key":{"type":["object","null"],"description":"The key's own name, prefix and scopes, when the caller used one."}},"additionalProperties":true},"Summary":{"type":"object","additionalProperties":true,"description":"Counts rather than rows. A figure the workspace has nothing for is `0`, and a figure that cannot be counted is `null` — never a zero standing in for an unreadable number."},"Ticket":{"type":"object","properties":{"id":{"type":"string"},"number":{"type":"integer","description":"The desk's own ticket number, allocated per workspace."},"subject":{"type":"string"},"status":{"type":"string","description":"`open`, `pending`, `resolved` or `closed`."},"priority":{"type":"string"},"queue":{"type":"string"},"contactId":{"type":["string","null"]},"assigneeUserId":{"type":["string","null"]},"requesterName":{"type":["string","null"]},"requesterEmail":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"TicketMessage":{"type":"object","properties":{"id":{"type":"string"},"ticketId":{"type":"string"},"body":{"type":"string"},"internal":{"type":"boolean","description":"`true` for a note only the workspace sees. A customer's read hides it."},"authorUserId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"Contact":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":["string","null"]},"phone":{"type":["string","null"]},"companyId":{"type":["string","null"]},"lifecycle":{"type":["string","null"]},"leadStatus":{"type":["string","null"]},"ownerUserId":{"type":["string","null"]},"archivedAt":{"type":["string","null"],"format":"date-time"}},"additionalProperties":true},"Company":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"industry":{"type":["string","null"]},"domain":{"type":["string","null"]}},"additionalProperties":true},"Deal":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"value":{"type":["number","null"]},"stageId":{"type":["string","null"]},"status":{"type":"string"}},"additionalProperties":true},"Stage":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"position":{"type":"integer"}},"additionalProperties":true},"Task":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"dueAt":{"type":["string","null"],"format":"date-time"},"done":{"type":"boolean"},"assigneeUserId":{"type":["string","null"]}},"additionalProperties":true},"Activity":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string"},"body":{"type":["string","null"]},"occurredAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"SavedView":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"screen":{"type":"string"},"filters":{"type":"object","additionalProperties":true}},"additionalProperties":true},"CustomField":{"type":"object","properties":{"id":{"type":"string"},"entity":{"type":"string"},"label":{"type":"string"},"kind":{"type":"string"},"position":{"type":"integer"}},"additionalProperties":true},"TeamMember":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"role":{"type":"string"},"isOperator":{"type":"boolean"}},"additionalProperties":true},"Project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"customerId":{"type":["string","null"]}},"additionalProperties":true},"Section":{"type":"object","properties":{"id":{"type":"string"},"projectId":{"type":"string"},"name":{"type":"string"},"position":{"type":"integer"}},"additionalProperties":true},"Card":{"type":"object","properties":{"id":{"type":"string"},"projectId":{"type":"string"},"sectionId":{"type":["string","null"]},"title":{"type":"string"},"done":{"type":"boolean"},"dueAt":{"type":["string","null"],"format":"date-time"},"assigneeUserId":{"type":["string","null"]}},"additionalProperties":true},"Subtask":{"type":"object","properties":{"id":{"type":"string"},"cardId":{"type":"string"},"title":{"type":"string"},"done":{"type":"boolean"}},"additionalProperties":true},"Checklist":{"type":"object","properties":{"id":{"type":"string"},"cardId":{"type":"string"},"title":{"type":"string"},"items":{"type":"array","items":{"type":"object","additionalProperties":true}}},"additionalProperties":true},"ChecklistItem":{"type":"object","properties":{"id":{"type":"string"},"checklistId":{"type":"string"},"title":{"type":"string"},"done":{"type":"boolean"}},"additionalProperties":true},"Comment":{"type":"object","properties":{"id":{"type":"string"},"cardId":{"type":"string"},"body":{"type":"string"},"authorUserId":{"type":["string","null"]}},"additionalProperties":true},"TimeEntry":{"type":"object","properties":{"id":{"type":"string"},"cardId":{"type":"string"},"minutes":{"type":"integer"},"spentOn":{"type":"string","format":"date"}},"additionalProperties":true},"Label":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"colour":{"type":["string","null"]}},"additionalProperties":true},"Call":{"type":"object","properties":{"id":{"type":"string"},"callSid":{"type":"string"},"direction":{"type":"string","description":"`inbound` or `outbound`."},"from":{"type":"string"},"to":{"type":"string"},"outcome":{"type":"string","description":"Answered or not, by the log's own test — the same clause the dashboard's tiles count."},"startedAt":{"type":"string","format":"date-time"},"seconds":{"type":["integer","null"]}},"additionalProperties":true},"Voicemail":{"type":"object","properties":{"id":{"type":"string"},"callSid":{"type":"string"},"from":{"type":"string"},"seconds":{"type":["integer","null"]},"listened":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"LiveCall":{"type":"object","additionalProperties":true,"description":"The call in progress, as the provider describes it, or `null` when nothing is up."},"Number":{"type":"object","properties":{"id":{"type":"string"},"e164":{"type":"string"},"label":{"type":["string","null"]},"status":{"type":"string"},"capabilities":{"type":"object","additionalProperties":true}},"additionalProperties":true},"Extension":{"type":"object","properties":{"id":{"type":"string"},"numberId":{"type":"string"},"extension":{"type":"string"},"name":{"type":["string","null"]}},"additionalProperties":true},"CallFlow":{"type":"object","additionalProperties":true,"description":"Which greeting plays, where a call rings and what happens when nobody answers."},"Verification":{"type":"object","additionalProperties":true,"description":"Where a toll-free number stands with the carriers, and what they said about it."},"VerificationPlan":{"type":"object","additionalProperties":true,"description":"What a toll-free submission must contain, and the ceilings it is held to."},"Greeting":{"type":"object","properties":{"kind":{"type":"string","description":"`auto_attendant` or `voicemail`."},"url":{"type":["string","null"]},"bytes":{"type":["integer","null"]}},"additionalProperties":true},"SoftphoneToken":{"type":"object","properties":{"token":{"type":"string"},"identity":{"type":"string"},"expiresAt":{"type":["string","null"],"format":"date-time"}},"additionalProperties":true},"CreditMovement":{"type":"object","properties":{"id":{"type":"string"},"delta":{"type":"integer"},"balanceAfter":{"type":"integer"},"reason":{"type":["string","null"],"description":"The operator's own words, which is what the customer reads."},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"WebhookEndpoint":{"type":"object","properties":{"id":{"type":"string","description":"`whe_…`. Use it in the routes below."},"url":{"type":"string","description":"HTTPS only. Where the events are POSTed."},"events":{"description":"The events this endpoint wants, as a list — or the string `*` for all of them.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"description":{"type":["string","null"]},"active":{"type":"boolean","description":"An endpoint switched off by too many failures says so in `disabledReason`, and `PATCH {active:true}` turns it back on."},"createdAt":{"type":"string","format":"date-time"},"lastSuccessAt":{"type":["string","null"],"format":"date-time"},"lastFailureAt":{"type":["string","null"],"format":"date-time"},"failureCount":{"type":"integer","description":"Consecutive failures since the last delivered event. At 20 the endpoint is switched off."},"disabledAt":{"type":["string","null"],"format":"date-time"},"disabledReason":{"type":["string","null"]}},"additionalProperties":true},"WebhookDelivery":{"type":"object","properties":{"id":{"type":"string","description":"`whd_…`. It travels in the `X-Kylosys-Delivery` header of the request, so a receiver can spot a repeat."},"endpointId":{"type":"string"},"event":{"type":"string","description":"One of: ping, ticket.created, ticket.updated, contact.created, contact.updated, company.created, company.updated, deal.created."},"status":{"type":"string","description":"`pending` (another attempt is scheduled), `delivered`, or `failed` (the attempts are exhausted)."},"attempts":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"lastAttemptAt":{"type":["string","null"],"format":"date-time"},"nextAttemptAt":{"type":["string","null"],"format":"date-time"},"deliveredAt":{"type":["string","null"],"format":"date-time"},"responseStatus":{"type":["integer","null"],"description":"What the receiver answered, or `null` if nothing answered at all."},"responseSnippet":{"type":["string","null"],"description":"The first bytes of its answer, or why there was none."}},"additionalProperties":true},"EmailChannel":{"type":"object","properties":{"address":{"type":["string","null"]},"label":{"type":["string","null"]},"replyTo":{"type":["string","null"]}},"additionalProperties":true},"EmailMessage":{"type":"object","properties":{"id":{"type":"string"},"threadId":{"type":"string"},"from":{"type":"string"},"subject":{"type":["string","null"]},"receivedAt":{"type":"string","format":"date-time"},"unread":{"type":"boolean"}},"additionalProperties":true},"AddressCheck":{"type":"object","properties":{"available":{"type":"boolean"},"suggestions":{"type":"array","items":{"type":"string"}}},"additionalProperties":true},"Settings":{"type":"object","additionalProperties":true,"description":"Every area's settings, or one area's when `{area}` names it."},"Integration":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"connected":{"type":"boolean"}},"additionalProperties":true},"AssistantAbout":{"type":"object","additionalProperties":true,"description":"The tools the assistant holds, and the fields it may read."},"AssistantAction":{"type":"object","properties":{"id":{"type":"string"},"summary":{"type":"string"},"undoable":{"type":"boolean"}},"additionalProperties":true},"AssistantThread":{"type":"object","additionalProperties":true},"AssistantAnswer":{"type":"object","additionalProperties":true,"description":"The lines to print, the thread they belong to, and what was done — each action with a summary a person reads."},"Palette":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"colours":{"type":"array","items":{"type":"string"}},"active":{"type":"boolean"}},"additionalProperties":true},"LogoDesign":{"type":"object","properties":{"text":{"type":["string","null"]},"shape":{"type":["string","null"]},"fg":{"type":["string","null"]},"bg":{"type":["string","null"]}},"additionalProperties":true},"CalendarEvent":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":["string","null"],"format":"date-time"},"allDay":{"type":"boolean"},"projectId":{"type":["string","null"]},"source":{"type":"string","description":"`kylosys` for an entry made here, or the connected calendar it was imported from — an imported copy is read-only."}},"additionalProperties":true},"CalendarConnection":{"type":"object","properties":{"provider":{"type":"string"},"connected":{"type":"boolean"},"lastSyncedAt":{"type":["string","null"],"format":"date-time"}},"additionalProperties":true},"ImportReport":{"type":"object","properties":{"imported":{"type":"integer"},"skipped":{"type":"integer"},"failed":{"type":"integer"}},"additionalProperties":true},"SlaPolicy":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"firstResponseMinutes":{"type":["integer","null"]},"resolveMinutes":{"type":["integer","null"]}},"additionalProperties":true},"CannedResponse":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"}},"additionalProperties":true}},"responses":{"Error":{"description":"The API's error envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/ping":{"get":{"summary":"Check that a key works, and which version answers it","tags":["Core"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The cheapest call the API has: the service's name, the API's version and the server's own time. `401` means the key is missing, expired or revoked.","security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/me":{"get":{"summary":"The workspace this key belongs to, and what the key may do","tags":["Core"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Answers the business's name and id, the key's own scopes and name, and — for a session — the person. A key has no person: `user` is `null` and `scopes` is what it was minted with.","security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/openapi.json":{"get":{"summary":"This document","tags":["Core"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}}},"description":"Open, so a client or a documentation tool can read it without a key. It describes the whole key surface; the doors outside it are named in this document's own description.","x-required-scope":"read"}},"/summary":{"get":{"summary":"The workspace's own figures, in one answer","tags":["Core"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/search":{"get":{"summary":"Search tickets and CRM records at once","tags":["Core"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Answers the two lists side by side rather than a merged one, because a ticket and a contact are not the same kind of thing. A query shorter than two characters answers empty lists rather than the whole workspace.","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Free text to filter by. On `/search` it must be at least two characters."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/credits":{"get":{"summary":"The credit balance, and the movements that made it","tags":["Core"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/terminal":{"get":{"summary":"What the Terminal starts from","tags":["Core"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The prompt, the welcome, the commands the server parses and whether the assistant is available on this host. Nothing here is a command.","security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Run one line in the Terminal","tags":["Core"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Send `{line}`. Answered with the lines to print and the id of the thread it used, so a caller can carry on the same conversation.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/tickets":{"get":{"summary":"List tickets","tags":["Helpdesk"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Free text to filter by. On `/search` it must be at least two characters."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to skip, for paging. Zero or more."},{"name":"view","in":"query","required":false,"schema":{"type":"string"},"description":"A saved view's key, applied server-side."},{"name":"status","in":"query","required":false,"schema":{"type":"string"},"description":"The record's status."},{"name":"priority","in":"query","required":false,"schema":{"type":"string"},"description":"The ticket's priority."},{"name":"queue","in":"query","required":false,"schema":{"type":"string"},"description":"The ticket's queue."},{"name":"assignee","in":"query","required":false,"schema":{"type":"string"},"description":"Who the work belongs to: a teammate's id, `me`, or `none`."},{"name":"guest","in":"query","required":false,"schema":{"type":"string"},"description":"Set to `1` for tickets raised by somebody with no account here."},{"name":"tag","in":"query","required":false,"schema":{"type":"string"},"description":"Only records carrying this tag."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"The column to order by."},{"name":"contactId","in":"query","required":false,"schema":{"type":"string"},"description":"Only records belonging to this contact."},{"name":"companyId","in":"query","required":false,"schema":{"type":"string"},"description":"Only records belonging to this company."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Raise a ticket","tags":["Helpdesk"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"A key may raise a ticket for somebody with no account here: send `requesterName` and `requesterEmail`, and the ticket is linked to the contact with that address, or to a new contact when there is none. `subject` is required.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/tickets/{id}":{"get":{"summary":"One ticket, with its messages","tags":["Helpdesk"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"patch":{"summary":"Change a ticket","tags":["Helpdesk"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"post":{"summary":"Change a ticket (POST is accepted beside PATCH)","tags":["Helpdesk"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a ticket","tags":["Helpdesk"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"This erases the ticket and its messages. Nothing about it is kept.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/tickets/{id}/messages":{"get":{"summary":"The messages on a ticket","tags":["Helpdesk"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"public","in":"query","required":false,"schema":{"type":"string"},"description":"Set to `1` to read only the messages a customer could see."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Add a message to a ticket","tags":["Helpdesk"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"An internal note and a reply to the customer are the same row with a different flag: send `internal: true` for a note, which the customer's own `?public=1` read then hides.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/tickets/{id}/link-contact":{"post":{"summary":"Link a ticket to an existing contact","tags":["Helpdesk"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/tickets/{id}/create-contact":{"post":{"summary":"Create a contact out of a ticket's requester","tags":["Helpdesk"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/ticket-summary":{"get":{"summary":"The desk's counts","tags":["Helpdesk"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Counts, not a page of rows. A key has no person, so \"mine\" is legitimately zero rather than an error.","security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/sla-policies":{"get":{"summary":"List the desk's service-level policies","tags":["Helpdesk"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Add a service-level policy","tags":["Helpdesk"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/sla-policies/{id}":{"patch":{"summary":"Change a service-level policy","tags":["Helpdesk"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a service-level policy","tags":["Helpdesk"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/canned-responses":{"get":{"summary":"List the desk's saved replies","tags":["Helpdesk"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Add a saved reply","tags":["Helpdesk"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/canned-responses/{id}":{"patch":{"summary":"Change a saved reply","tags":["Helpdesk"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a saved reply","tags":["Helpdesk"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/contacts":{"get":{"summary":"List contacts","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Free text to filter by. On `/search` it must be at least two characters."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to skip, for paging. Zero or more."},{"name":"lifecycle","in":"query","required":false,"schema":{"type":"string"},"description":"The contact's lifecycle stage."},{"name":"leadStatus","in":"query","required":false,"schema":{"type":"string"},"description":"The contact's lead status."},{"name":"ownerUserId","in":"query","required":false,"schema":{"type":"string"},"description":"Only records owned by this teammate."},{"name":"tag","in":"query","required":false,"schema":{"type":"string"},"description":"Only records carrying this tag."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"The column to order by."},{"name":"companyId","in":"query","required":false,"schema":{"type":"string"},"description":"Only records belonging to this company."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Create a contact","tags":["CRM"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/contacts/export":{"get":{"summary":"Export every contact as CSV","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"`text/csv`, one row per contact, for a spreadsheet. It is a read, so a read-only key may call it — which is exactly why a key handed to a browser is dangerous, and why publishable keys are on the roadmap.","security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/contacts/import":{"post":{"summary":"Import contacts from CSV","tags":["CRM"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/contacts/{id}":{"get":{"summary":"One contact","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"patch":{"summary":"Change a contact","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Archive a contact","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"An archive, not an erase: the row keeps its place for the records that point at it.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/contacts/{id}/activities":{"get":{"summary":"The activities recorded against a contact","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Record an activity against a contact","tags":["CRM"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/companies":{"get":{"summary":"List companies","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Free text to filter by. On `/search` it must be at least two characters."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to skip, for paging. Zero or more."},{"name":"industry","in":"query","required":false,"schema":{"type":"string"},"description":"The company's industry."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"The column to order by."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Create a company","tags":["CRM"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/companies/{id}":{"get":{"summary":"One company","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"patch":{"summary":"Change a company","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Archive a company","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/deals":{"get":{"summary":"List deals","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Free text to filter by. On `/search` it must be at least two characters."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to skip, for paging. Zero or more."},{"name":"status","in":"query","required":false,"schema":{"type":"string"},"description":"The record's status."},{"name":"ownerUserId","in":"query","required":false,"schema":{"type":"string"},"description":"Only records owned by this teammate."},{"name":"companyId","in":"query","required":false,"schema":{"type":"string"},"description":"Only records belonging to this company."},{"name":"contactId","in":"query","required":false,"schema":{"type":"string"},"description":"Only records belonging to this contact."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"The column to order by."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Create a deal","tags":["CRM"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/deals/{id}":{"get":{"summary":"One deal","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"patch":{"summary":"Change a deal","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a deal","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/deals/{id}/move":{"post":{"summary":"Move a deal to another stage","tags":["CRM"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/stages":{"get":{"summary":"The pipeline's stages, in order","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/tasks":{"get":{"summary":"List tasks","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Free text to filter by. On `/search` it must be at least two characters."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to skip, for paging. Zero or more."},{"name":"status","in":"query","required":false,"schema":{"type":"string"},"description":"The record's status."},{"name":"due","in":"query","required":false,"schema":{"type":"string"},"description":"Only work that is due."},{"name":"assignee","in":"query","required":false,"schema":{"type":"string"},"description":"Who the work belongs to: a teammate's id, `me`, or `none`."},{"name":"contactId","in":"query","required":false,"schema":{"type":"string"},"description":"Only records belonging to this contact."},{"name":"dealId","in":"query","required":false,"schema":{"type":"string"},"description":"Only records belonging to this deal."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"The column to order by."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Create a task","tags":["CRM"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/tasks/{id}":{"patch":{"summary":"Change a task","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a task","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/activities/{id}":{"delete":{"summary":"Delete an activity","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/views":{"get":{"summary":"The saved views on a screen","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"screen","in":"query","required":false,"schema":{"type":"string"},"description":"Which screen's saved views to read."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Save a view","tags":["CRM"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/views/{id}":{"delete":{"summary":"Delete a saved view","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/fields":{"get":{"summary":"The custom fields defined for a record type","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"entity","in":"query","required":false,"schema":{"type":"string"},"description":"Which record type a custom field belongs to."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Define a custom field","tags":["CRM"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/fields/{id}":{"patch":{"summary":"Change a custom field","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a custom field","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/team":{"get":{"summary":"The people in this workspace","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Anyone here can read the list. Changing a role or removing somebody is the workspace's own business and needs the same rights the settings screen does.","security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/team/{userId}":{"patch":{"summary":"Change a teammate's role","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"},"description":"The person's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Remove a teammate from the workspace","tags":["CRM"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"},"description":"The person's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/project-summary":{"get":{"summary":"The project figures","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/my-work":{"get":{"summary":"The work assigned to the caller","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to skip, for paging. Zero or more."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/projects":{"get":{"summary":"List projects","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Free text to filter by. On `/search` it must be at least two characters."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to skip, for paging. Zero or more."},{"name":"status","in":"query","required":false,"schema":{"type":"string"},"description":"The record's status."},{"name":"customerId","in":"query","required":false,"schema":{"type":"string"},"description":"Only work for this customer."},{"name":"memberUserId","in":"query","required":false,"schema":{"type":"string"},"description":"Only work assigned to this project member."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"The column to order by."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Create a project","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/projects/{id}":{"get":{"summary":"One project","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"patch":{"summary":"Change a project","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Archive a project","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/projects/{id}/activity":{"get":{"summary":"What has happened in a project","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/projects/{id}/labels":{"get":{"summary":"The labels a project can use","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Add a label to a project","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/projects/{id}/sections":{"post":{"summary":"Add a section to a project","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/projects/{id}/members":{"get":{"summary":"The people on a project","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Put somebody on a project","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/projects/{id}/members/{userId}":{"delete":{"summary":"Take somebody off a project","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"userId","in":"path","required":true,"schema":{"type":"string"},"description":"The person's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/sections/{id}":{"patch":{"summary":"Change a section","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a section","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/cards":{"get":{"summary":"List cards","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Free text to filter by. On `/search` it must be at least two characters."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to skip, for paging. Zero or more."},{"name":"projectId","in":"query","required":false,"schema":{"type":"string"},"description":"Only records in this project."},{"name":"sectionId","in":"query","required":false,"schema":{"type":"string"},"description":"Only cards in this section."},{"name":"labelId","in":"query","required":false,"schema":{"type":"string"},"description":"Only cards carrying this label."},{"name":"assignee","in":"query","required":false,"schema":{"type":"string"},"description":"Who the work belongs to: a teammate's id, `me`, or `none`."},{"name":"blocking","in":"query","required":false,"schema":{"type":"string"},"description":"Set to `1` for the work that is blocking something else."},{"name":"unassigned","in":"query","required":false,"schema":{"type":"string"},"description":"Set to `1` for work nobody has taken."},{"name":"mine","in":"query","required":false,"schema":{"type":"string"},"description":"Set to `1` for the caller's own work."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"The column to order by."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Create a card","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/cards/{id}":{"get":{"summary":"One card","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"patch":{"summary":"Change a card","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a card","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/cards/{id}/move":{"post":{"summary":"Move a card to another section","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/cards/{id}/copy":{"post":{"summary":"Copy a card","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/cards/{id}/labels":{"post":{"summary":"Put a label on a card","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/cards/{id}/deps":{"post":{"summary":"Make one card depend on another","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Remove a dependency","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/cards/{id}/subtasks":{"post":{"summary":"Add a subtask to a card","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/cards/{id}/checklists":{"post":{"summary":"Add a checklist to a card","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/cards/{id}/comments":{"post":{"summary":"Comment on a card","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/cards/{id}/time":{"post":{"summary":"Record time against a card","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/subtasks/{id}":{"patch":{"summary":"Change a subtask","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a subtask","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/checklists/{id}":{"patch":{"summary":"Change a checklist","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a checklist","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/checklists/{id}/items":{"post":{"summary":"Add a step to a checklist","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/checklist-items/{id}":{"patch":{"summary":"Tick or change a checklist step","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a checklist step","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/comments/{id}":{"delete":{"summary":"Delete a comment","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/labels":{"post":{"summary":"Create a workspace label","tags":["Projects"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/labels/{id}":{"patch":{"summary":"Change a label","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a label","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/time-entries/{id}":{"delete":{"summary":"Delete a time entry","tags":["Projects"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/messages":{"get":{"summary":"The texts on a line, as conversations","tags":["Messaging"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Answers the threads, the trays' counts and the lines that can carry text. A line carries no text until the carriers have approved it, and the answer says so rather than offering a send that fails.","parameters":[{"name":"number","in":"query","required":false,"schema":{"type":"string"},"description":"The line, as E.164."},{"name":"state","in":"query","required":false,"schema":{"type":"string"},"description":"Which tray to read: `active`, `archived` or `spam`."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to skip, for paging. Zero or more."},{"name":"peer","in":"query","required":false,"schema":{"type":"string"},"description":"The other party's address, for one conversation."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Send a text","tags":["Messaging"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Send `{to, body, number?}`. A refusal says why — an unapproved line, a number that cannot text, or a body the carrier would not take.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/messages/{id}":{"delete":{"summary":"Delete one text","tags":["Messaging"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/threads":{"post":{"summary":"Move a conversation between trays","tags":["Messaging"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Send `{peer, state}` to archive one, mark it spam, or put it back.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Clear conversations","tags":["Messaging"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"One conversation with `peer`, or up to 200 at once with `peers`.","parameters":[{"name":"peer","in":"query","required":false,"schema":{"type":"string"},"description":"The other party's address, for one conversation."},{"name":"peers","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated addresses, at most 200, for clearing several conversations."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/numbers":{"get":{"summary":"The lines this workspace holds","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"includeReleased","in":"query","required":false,"schema":{"type":"string"},"description":"Set to `1` to include lines this workspace has given up."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/numbers/available":{"get":{"summary":"Search the carrier for numbers to buy","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"A live search at the carrier, so it costs a call and answers with what is available now — not with a stored list.","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string"},"description":"The kind of number to search for."},{"name":"areaCode","in":"query","required":false,"schema":{"type":"string"},"description":"The area code to search within."},{"name":"contains","in":"query","required":false,"schema":{"type":"string"},"description":"Only numbers whose digits contain this."},{"name":"country","in":"query","required":false,"schema":{"type":"string"},"description":"The country to search in."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."},{"name":"voice","in":"query","required":false,"schema":{"type":"string"},"description":"Set to `1` for lines that can carry voice."},{"name":"sms","in":"query","required":false,"schema":{"type":"string"},"description":"Set to `1` for lines that can carry text."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/numbers/buy":{"post":{"summary":"Buy a number","tags":["Phone"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Buying spends credits, so it is a write: a read-only key is refused. The price depends on the number's own prefix — 5 credits local, 8 toll-free — rather than on anything the caller sends.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/numbers/release/{e164}":{"post":{"summary":"Give a number back","tags":["Phone"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"e164","in":"path","required":true,"schema":{"type":"string"},"description":"The number, as E.164, with the leading `+` percent-encoded."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/numbers/transfer/{e164}":{"post":{"summary":"Hand a line to another workspace","tags":["Phone"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Refused for a key with `403 not_allowed`: a key is not a person and cannot prove it belongs to the workspace receiving the line. A signed-in session may do it, and only into a workspace that person is already a member of.","parameters":[{"name":"e164","in":"path","required":true,"schema":{"type":"string"},"description":"The number, as E.164, with the leading `+` percent-encoded."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/numbers/{id}":{"get":{"summary":"One line","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"patch":{"summary":"Change a line's settings","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/numbers/{id}/flow":{"get":{"summary":"Where a line's calls go","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"put":{"summary":"Set where a line's calls go","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/numbers/{id}/extensions":{"get":{"summary":"The extensions on a line","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Add an extension","tags":["Phone"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/numbers/{id}/recheck":{"post":{"summary":"Ask the carrier about a line again","tags":["Phone"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/numbers/{id}/verification":{"get":{"summary":"Where a toll-free number stands with the carriers","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"live","in":"query","required":false,"schema":{"type":"string"},"description":"Set to `1` to ask the provider rather than answer from what was stored."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Submit a toll-free number for approval","tags":["Phone"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/numbers/{id}/verification/plan":{"post":{"summary":"What a toll-free submission needs","tags":["Phone"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/extensions/{id}":{"patch":{"summary":"Change an extension","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete an extension","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/phone/call-stats":{"get":{"summary":"Counts of calls, answered and missed","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Counted in SQL rather than added up from a page of rows, because the log stops at 200: a business with a busy month would otherwise read `200` for ever. The definition of a missed call lives beside the rows it describes.","security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/phone/live":{"get":{"summary":"The call happening right now, if any","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/phone/incoming":{"get":{"summary":"Calls arriving, since a cursor","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"string"},"description":"Only what happened after this cursor, which the previous answer returned."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/phone/caller":{"get":{"summary":"What is known about a caller","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The customer, the company and the recent history with that number, in one answer.","parameters":[{"name":"phone","in":"query","required":false,"schema":{"type":"string"},"description":"A phone number to look up."},{"name":"contactId","in":"query","required":false,"schema":{"type":"string"},"description":"Only records belonging to this contact."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/phone/calls":{"get":{"summary":"The call log","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"delete":{"summary":"Clear call-log entries","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Up to 200 ids at once.","parameters":[{"name":"ids","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated record ids, at most 200, for clearing several at once."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/phone/calls/{id}":{"delete":{"summary":"Clear one call-log entry","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/phone/voicemail":{"get":{"summary":"The voicemail tray","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"delete":{"summary":"Clear voicemail entries","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"ids","in":"query","required":false,"schema":{"type":"string"},"description":"Comma-separated record ids, at most 200, for clearing several at once."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/phone/voicemail/{id}":{"delete":{"summary":"Clear one voicemail","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/phone/recording/{callSid}":{"get":{"summary":"The audio of a recorded call","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Raw audio bytes, `private, no-store` — not JSON. Support for range requests, so a player can seek.","parameters":[{"name":"callSid","in":"path","required":true,"schema":{"type":"string"},"description":"The call's provider-side id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/phone/token":{"get":{"summary":"A credential for the browser's softphone","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Short-lived and scoped to one line. Signing it needs the provider's API key, which only the platform holds.","security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/phone/hangup":{"post":{"summary":"End a call that is still up","tags":["Phone"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/phone/dial":{"post":{"summary":"Place a call","tags":["Phone"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Rings a phone and connects it to a number. A write, and it spends credits.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/phone/greetings":{"get":{"summary":"The greetings a line plays","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/phone/greetings/auto_attendant":{"post":{"summary":"Upload the auto-attendant greeting","tags":["Phone"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The audio itself, as the request body: `audio/mpeg` or `audio/wav`, up to 1,000,000 bytes. Answers `413` in words when it is larger.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Remove the auto-attendant greeting","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/phone/greetings/voicemail":{"post":{"summary":"Upload the voicemail greeting","tags":["Phone"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The audio itself, as the request body, under the same ceiling as the other greeting.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Remove the voicemail greeting","tags":["Phone"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/email":{"get":{"summary":"The Inbox: its channels, counts and threads","tags":["Inbox"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The address, the trays' counts and one tray's threads. Also the largest attachment this host will keep, so a screen can say so instead of offering a download that would fail.","parameters":[{"name":"tray","in":"query","required":false,"schema":{"type":"string"},"description":"Which tray to read: `open`, `archived` or `spam`."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"patch":{"summary":"Change the Inbox's own settings","tags":["Inbox"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/email/address":{"get":{"summary":"Is this Inbox address free?","tags":["Inbox"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Asked as somebody types, so it is read-only and reserves nothing: a name is taken by claiming it, never by looking at it.","security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Claim an Inbox address","tags":["Inbox"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/email/test":{"post":{"summary":"Send a test message from the Inbox","tags":["Inbox"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Sends real mail to the address given, so it is rate-limited to ten an hour. It is the one route here whose whole purpose is to put a message on the wire.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/email/{id}":{"get":{"summary":"One message","tags":["Inbox"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"patch":{"summary":"Change a message's own flags","tags":["Inbox"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a message","tags":["Inbox"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/email/{id}/reply":{"post":{"summary":"Reply to a message","tags":["Inbox"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Builds the reply's own headers — the thread's `References`, and the address it is sent from — so a client sends a body and a recipient rather than a message. Sends real mail.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/email-attachment/{id}":{"get":{"summary":"The bytes of an attachment","tags":["Inbox"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The stored file, with its own content type and `nosniff`. An attachment larger than the host keeps is refused before it is stored, so this answers `404` rather than half a file.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/settings":{"get":{"summary":"Every setting the workspace has","tags":["Settings"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/settings/integrations":{"get":{"summary":"The integrations, and what each one needs","tags":["Settings"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/settings/phone/apply":{"post":{"summary":"Apply the platform's phone defaults here","tags":["Settings"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/settings/{area}":{"get":{"summary":"One settings area","tags":["Settings"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"area","in":"path","required":true,"schema":{"type":"string"},"description":"The settings area: `phone`, `helpdesk` or `crm`."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"patch":{"summary":"Change one settings area","tags":["Settings"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"area","in":"path","required":true,"schema":{"type":"string"},"description":"The settings area: `phone`, `helpdesk` or `crm`."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"put":{"summary":"Replace one settings area","tags":["Settings"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"area","in":"path","required":true,"schema":{"type":"string"},"description":"The settings area: `phone`, `helpdesk` or `crm`."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/ai/about":{"get":{"summary":"What the assistant can do, and what it can see","tags":["Assistant"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The tools it holds and the fields it may read — the same list the server enforces, so a client can describe it without guessing.","security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/ai/actions":{"get":{"summary":"What the assistant has just done, and can undo","tags":["Assistant"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/ai/thread":{"get":{"summary":"One assistant thread, as it stands","tags":["Assistant"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"threadId","in":"query","required":false,"schema":{"type":"string"},"description":"The assistant thread to read."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/ai/chat":{"post":{"summary":"Ask the assistant in words","tags":["Assistant"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"One turn, one body — there is no stream. Rate-limited to four a minute and thirty an hour; the wait is bounded by the server, which answers rather than hanging.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/ai/execute":{"post":{"summary":"Run one of the assistant's tools by name","tags":["Assistant"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"No model is involved, which is what makes every tool provable on a host that holds no key. A reader can only ever answer about the caller's own workspace.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/ai/undo":{"post":{"summary":"Take back what the assistant just wrote","tags":["Assistant"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Offered only where what it wrote can be taken back: a read wrote nothing, so it has nothing to undo.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/palettes":{"get":{"summary":"The workspace's colour palettes","tags":["Branding"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Save a palette","tags":["Branding"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"patch":{"summary":"Mark a palette active","tags":["Branding"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/palettes/{id}":{"patch":{"summary":"Change a palette","tags":["Branding"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a palette","tags":["Branding"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/brand":{"get":{"summary":"The workspace's logo design","tags":["Branding"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The letters, the shape and the two colours — the design, not the picture. The rendered mark is served from `/api/logo/{businessId}`, which needs no credential and is what every screen reads.","security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Store a logo design","tags":["Branding"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Every field is optional and a whole design is stored, so a stored row always draws. Letters are cut to sixteen; each colour must be `#RRGGBB`.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/calendar/events":{"get":{"summary":"The calendar, over a window","tags":["Calendar"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"A timed entry is read in the reader's own zone; an all-day entry stands on its own date and is not moved by one. Work that is merely due is folded in when asked for.","parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string"},"description":"The start of a window, as an ISO date or date-time."},{"name":"to","in":"query","required":false,"schema":{"type":"string"},"description":"The end of a window, as an ISO date or date-time."},{"name":"projectId","in":"query","required":false,"schema":{"type":"string"},"description":"Only records in this project."},{"name":"include","in":"query","required":false,"schema":{"type":"string"},"description":"Extra records to fold into the answer, named by the caller."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Add a calendar entry","tags":["Calendar"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/calendar/events/{id}":{"patch":{"summary":"Change a calendar entry","tags":["Calendar"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"put":{"summary":"Replace a calendar entry","tags":["Calendar"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete a calendar entry","tags":["Calendar"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/calendar/sync":{"post":{"summary":"Pull the connected calendar in again","tags":["Calendar"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The one route inside this API with a rate limit of its own: thirty an hour per workspace, because each call reaches the provider.","parameters":[{"name":"force","in":"query","required":false,"schema":{"type":"string"},"description":"Set to `1` to ignore what is already known and ask the provider again."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/calendar/connections":{"get":{"summary":"Which calendars are connected","tags":["Calendar"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/calendar/connections/{provider}":{"delete":{"summary":"Disconnect a calendar","tags":["Calendar"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string"},"description":"The calendar's name: `google` or `microsoft`."},{"name":"provider","in":"query","required":false,"schema":{"type":"string"},"description":"`provider`."},{"name":"provider","in":"query","required":false,"schema":{"type":"string"},"description":"`provider`."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/webhooks":{"get":{"summary":"The URLs this workspace sends events to","tags":["Core"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Answers the endpoints and the whole list of events that exist, so a client can offer them rather than guess. A signing secret is never in a listing.","security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"post":{"summary":"Add a URL to be told about events","tags":["Core"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"HTTPS only, at most 500 characters and 10 endpoints per workspace. The answer carries the signing secret, and that is the only time it is ever shown — it is sealed at rest afterwards and no route reads it back.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/webhooks/{id}":{"get":{"summary":"One endpoint","tags":["Core"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"},"patch":{"summary":"Change a URL, its events, or whether it is on","tags":["Core"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Sending `active: true` is also what clears the reason an endpoint was switched off, and resets its failure count.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"},"delete":{"summary":"Delete an endpoint, and its log with it","tags":["Core"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The delivery log goes too: a delivery names a URL and holds the workspace's own data, and an endpoint nobody subscribes to should not leave either behind.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/webhooks/{id}/test":{"post":{"summary":"Send a `ping` now","tags":["Core"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"A real, signed delivery through the same path as every other event — a test that skipped the signature would prove nothing about the part most likely to be wrong. The answer reports what the receiver did.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/webhooks/{id}/rotate":{"post":{"summary":"Replace the signing secret","tags":["Core"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The answer carries the new secret once. The previous one stops working immediately and is not kept.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}},"/webhooks/{id}/deliveries":{"get":{"summary":"Every attempt made for one endpoint","tags":["Core"],"responses":{"200":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"There is no such record in this workspace — or no such route at all.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"The newest first. Each attempt carries its status, how many attempts it has had, when the next one is due, and the first bytes of what the receiver said — which is the difference between \"it failed\" and \"it did not like the signature\".","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"The record's own id."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to return: **1–500**, default **50**. The ceiling is enforced here, not suggested — `/phone/calls` and `/phone/voicemail` cap at 200, and `/threads` at 200 peers."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"},"description":"How many records to skip, for paging. Zero or more."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"read"}},"/webhooks/dispatch":{"post":{"summary":"Deliver what is due, now","tags":["Core"],"responses":{"201":{"description":"The API's own envelope, with `ok: true` and this route's own keys beside it.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Success"}]}}}},"401":{"description":"No credential, or one that is missing, expired or revoked. `error.code` says which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key may not do this (`read_only`), the module is switched off for this workspace (`suite_disabled`), or the caller is not allowed to do it (`not_allowed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Only when an `Idempotency-Key` is sent: that key was already used for a different request (`idempotency_conflict`), or a request with it is still running (`request_in_progress`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Something in the body was refused. `error.fields` names the fields and why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"This key has spent its window (`rate_limited`). `Retry-After` and the three `RateLimit-*` headers say how long to wait and what is left; see \"Rate limits\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Pages Functions have no scheduler, so retries ride on the workspace's own traffic (three due deliveries behind every write). This route is a cron elsewhere's way of doing it deliberately: it attempts up to twenty due deliveries and prunes the log past 30 days.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":200},"description":"Optional. Send the same key with a retry of the same request and the first answer is returned instead of the write happening twice, marked `Idempotency-Replayed: true`. Remembered for 24 hours; see \"Retrying safely\"."}],"security":[{"apiKey":[]},{"session":[]}],"x-required-scope":"write"}}}}