{"openapi":"3.1.0","info":{"title":"Project Blue API","version":"1.0.0","summary":"Native iMessage, SMS, Workflows, and FaceTime Audio from dedicated lines.","description":"REST API for Project Blue. Send iMessage and SMS, look up iMessage availability, manage contacts, enroll Workflows, and place FaceTime Audio calls.\n\n- Docs: https://api.tryprojectblue.com\n- MCP (Streamable HTTP): https://api.tryprojectblue.com/api/mcp\n- OAuth issuer: https://app.tryprojectblue.com\n\nEvery operation has a unique operationId for LLM function calling. Authenticate with `Authorization: Bearer <api key or OAuth access token>`.","contact":{"name":"Project Blue","url":"https://www.tryprojectblue.com/developers","email":"sales@tryprojectblue.com"}},"jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","servers":[{"url":"https://api.tryprojectblue.com","description":"Project Blue production API"}],"tags":[{"name":"Messages","description":"Send and read iMessage / SMS."},{"name":"Lines","description":"Dedicated phone lines."},{"name":"Lookups","description":"iMessage availability."},{"name":"Contacts","description":"External API contacts."},{"name":"Workflows","description":"List, enroll, and cancel Workflows."},{"name":"Calls","description":"Call logs and FaceTime Audio."},{"name":"MCP","description":"Model Context Protocol server."}],"paths":{"/send-api-message":{"post":{"operationId":"sendMessage","tags":["Messages"],"summary":"Send an iMessage or SMS","description":"Sends a message on a dedicated Project Blue line. Uses iMessage when the destination is reachable on Apple's network; otherwise SMS from the same line. Supports text, images, video, and AI voice memos.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["phone"],"properties":{"phone":{"type":"string","description":"Recipient. Normalized to E.164."},"message":{"type":"string"},"lineId":{"type":"string","format":"uuid"},"mediaAttachmentUrl":{"type":"string","format":"uri"},"audioAttachmentUrl":{"type":"string","format":"uri"},"enableAiVoiceMemo":{"type":"boolean"},"shouldAutoCreateContact":{"type":"boolean"},"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string","format":"email"},"customFields":{"type":"object","additionalProperties":true},"idempotencyKey":{"type":"string","minLength":1,"maxLength":200}}}}}},"responses":{"200":{"description":"Message accepted for delivery.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/send-group-message":{"post":{"operationId":"sendGroupMessage","tags":["Messages"],"summary":"Send a group iMessage","description":"Sends one message to 2–32 recipients in a single iMessage thread. Passing the same participant set again reuses the existing thread.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["numbers"],"properties":{"numbers":{"type":"array","minItems":2,"maxItems":32,"items":{"type":"string"}},"message":{"type":"string"},"mediaAttachmentUrl":{"type":"string","format":"uri"},"audioAttachmentUrl":{"type":"string","format":"uri"},"enableAiVoiceMemo":{"type":"boolean"},"groupName":{"type":"string"},"lineId":{"type":"string","format":"uuid"},"idempotencyKey":{"type":"string"}}}}}},"responses":{"200":{"description":"Group message queued.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/get-messages-api":{"get":{"operationId":"listMessages","tags":["Messages"],"summary":"List messages","description":"Returns a paginated list of messages. offset + limit must be ≤ 2000.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, default 100.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"description":"Pagination offset, default 0.","schema":{"type":"integer","minimum":0}},{"name":"order_by","in":"query","required":false,"description":"Sort field.","schema":{"type":"string","enum":["createdAt","sentAt"]}},{"name":"order_direction","in":"query","required":false,"description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"service","in":"query","required":false,"description":"Delivery service filter.","schema":{"type":"string","enum":["iMessage","SMS","RCS"]}},{"name":"direction","in":"query","required":false,"description":"Inbound or outbound.","schema":{"type":"string","enum":["inbound","outbound"]}},{"name":"pb_line_id","in":"query","required":false,"description":"Filter to one Project Blue line.","schema":{"type":"string"}},{"name":"from_number","in":"query","required":false,"description":"External sender (inbound only).","schema":{"type":"string"}},{"name":"to_number","in":"query","required":false,"description":"External recipient (outbound only).","schema":{"type":"string"}},{"name":"created_at_gte","in":"query","required":false,"description":"Lower bound on created_at (ISO-8601).","schema":{"type":"string","format":"date-time"}},{"name":"created_at_lte","in":"query","required":false,"description":"Upper bound on created_at (ISO-8601).","schema":{"type":"string","format":"date-time"}},{"name":"sent_at_gte","in":"query","required":false,"description":"Lower bound on sent_at (ISO-8601).","schema":{"type":"string","format":"date-time"}},{"name":"sent_at_lte","in":"query","required":false,"description":"Upper bound on sent_at (ISO-8601).","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Message page.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/get-message-api/{message_handle}":{"get":{"operationId":"getMessage","tags":["Messages"],"summary":"Get one message","description":"Fetch a single message by its opaque pbm_ handle.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"parameters":[{"name":"message_handle","in":"path","required":true,"description":"Handle returned by listMessages, starting with pbm_.","schema":{"type":"string","pattern":"^pbm_"}}],"responses":{"200":{"description":"Message record.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/get-lines":{"get":{"operationId":"listLines","tags":["Lines"],"summary":"List dedicated lines","description":"Lists phone lines for the authenticated project. Production accounts receive a JSON array; trial accounts may receive an object with trial: true instead.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"responses":{"200":{"description":"Array of lines, or a trial descriptor.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/api-check-imessage-availability":{"post":{"operationId":"lookupImessageAvailability","tags":["Lookups"],"summary":"Check iMessage availability","description":"Returns whether a destination number can receive native iMessage.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["phone"],"properties":{"phone":{"type":"string"}}}}}},"responses":{"200":{"description":"Availability result.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/create-external-contact":{"post":{"operationId":"createExternalContact","tags":["Contacts"],"summary":"Create an external contact","description":"Creates a contact the API can message and enroll in Workflows.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["phone"],"properties":{"phone":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"customFields":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"Created contact.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/get-external-contacts":{"get":{"operationId":"listExternalContacts","tags":["Contacts"],"summary":"List external contacts","description":"Lists contacts created via the API. Filter with phone for an exact E.164 match.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, default 100.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"description":"Pagination offset.","schema":{"type":"integer","minimum":0}},{"name":"phone","in":"query","required":false,"description":"Exact lookup after E.164 normalization.","schema":{"type":"string"}}],"responses":{"200":{"description":"Contact list.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/update-external-contact":{"post":{"operationId":"updateExternalContact","tags":["Contacts"],"summary":"Update an external contact","description":"Patches a contact. customFields replaces the stored object wholesale — fetch and merge client-side to keep keys.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["contactId"],"properties":{"contactId":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"note":{"type":"string"},"customFields":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"Updated contact.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/get-flows":{"get":{"operationId":"listWorkflows","tags":["Workflows"],"summary":"List Workflows","description":"Lists automation Workflows available to the project.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"responses":{"200":{"description":"Workflow list.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/enroll-flow":{"post":{"operationId":"enrollContactInWorkflow","tags":["Workflows"],"summary":"Enroll a contact in a Workflow","description":"Starts a Workflow run. Pass flowId in the JSON body (opaque UUID from listWorkflows).","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["flowId","phoneNumber"],"properties":{"flowId":{"type":"string","maxLength":64},"phoneNumber":{"type":"string"},"pb_line_id":{"type":"string","format":"uuid"}}}}}},"responses":{"200":{"description":"Enrollment created.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/cancel-flow-runs":{"delete":{"operationId":"cancelWorkflowRuns","tags":["Workflows"],"summary":"Cancel Workflow runs","description":"Cancels all active Workflow runs for a phone number.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["phoneNumber"],"properties":{"phoneNumber":{"type":"string"}}}}}},"responses":{"200":{"description":"Runs cancelled.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/get-call-logs-api":{"get":{"operationId":"listCallLogs","tags":["Calls"],"summary":"List call logs","description":"Returns call history with recordings and AI transcripts when available. offset + limit must be ≤ 2000.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size, default 100.","schema":{"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"description":"Pagination offset.","schema":{"type":"integer","minimum":0}},{"name":"call_log_timestamp","in":"query","required":false,"description":"Sort by created_at.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"pb_line_id","in":"query","required":false,"description":"Filter to one line.","schema":{"type":"string","format":"uuid"}},{"name":"answered_at_gte","in":"query","required":false,"description":"Inclusive lower bound on answered_at.","schema":{"type":"string","format":"date-time"}},{"name":"answered_at_lte","in":"query","required":false,"description":"Inclusive upper bound on answered_at.","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Call log page.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/start-facetime-call-api":{"post":{"operationId":"startFacetimeCall","tags":["Calls"],"summary":"Start a FaceTime Audio call","description":"Places a FaceTime Audio call from a FaceTime-enabled line. The call is ringing as soon as call_uuid is returned, even if agora is null.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["pb_line_id","phone_number"],"properties":{"pb_line_id":{"type":"string","format":"uuid"},"phone_number":{"type":"string"}}}}}},"responses":{"200":{"description":"Call started.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/get-facetime-call-status-api":{"get":{"operationId":"getFacetimeCallStatus","tags":["Calls"],"summary":"Get FaceTime Audio call status","description":"Reads live status for a FaceTime Audio call.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"parameters":[{"name":"call_uuid","in":"query","required":true,"description":"call_uuid from startFacetimeCall.","schema":{"type":"string"}}],"responses":{"200":{"description":"Call status.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/end-facetime-call-api":{"post":{"operationId":"endFacetimeCall","tags":["Calls"],"summary":"End a FaceTime Audio call","description":"Hangs up an in-progress FaceTime Audio call.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["call_uuid"],"properties":{"call_uuid":{"type":"string"}}}}}},"responses":{"200":{"description":"Call ended.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}},"/api/mcp":{"post":{"operationId":"mcpStreamableHttp","tags":["MCP"],"summary":"Project Blue MCP server (Streamable HTTP)","description":"Remote Model Context Protocol endpoint using Streamable HTTP. Authenticate with an OAuth 2.1 access token (scope mcp). Tools cover send message, availability, Workflows, lines, and FaceTime Audio.","security":[{"oauth2":["mcp"]}],"responses":{"200":{"description":"MCP JSON-RPC response or SSE stream.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}},"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"HTTP 400 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"401":{"description":"HTTP 401 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"403":{"description":"HTTP 403 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"404":{"description":"HTTP 404 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"409":{"description":"HTTP 409 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"429":{"description":"HTTP 429 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"500":{"description":"HTTP 500 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}},"502":{"description":"HTTP 502 error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API key or OAuth access token","description":"Dashboard API keys or OAuth access tokens."},"oauth2":{"type":"oauth2","description":"OAuth 2.1 authorization code + PKCE. Issuer https://app.tryprojectblue.com. Scope mcp covers REST and MCP.","flows":{"authorizationCode":{"authorizationUrl":"https://app.tryprojectblue.com/oauth/authorize","tokenUrl":"https://app.tryprojectblue.com/oauth/token","refreshUrl":"https://app.tryprojectblue.com/oauth/token","scopes":{"mcp":"Call the Project Blue REST API and MCP server."}}}}},"schemas":{"ApiError":{"type":"object","required":["error"],"properties":{"error":{"description":"Human-readable message. Historically a string; agents should also read `code` and `hint`.","oneOf":[{"type":"string"},{"type":"object"}]},"code":{"type":"string","description":"Stable machine code, e.g. unauthorized, invalid_request, rate_limited."},"hint":{"type":"string","description":"What to do next."}}}}},"externalDocs":{"description":"Project Blue API reference","url":"https://api.tryprojectblue.com"}}