{"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":"Contact cards","description":"A line's iMessage name and photo."},{"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."}}}}}}}}},"/request-line":{"post":{"operationId":"requestLine","tags":["Lines"],"summary":"Request new lines","description":"Sends a request to the Project Blue team for new lines in an area code. The team provisions them; this call does not return a line.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["requestedAreaCode","quantity"],"properties":{"requestedAreaCode":{"type":"string","pattern":"^[2-9][0-9]{2}$"},"quantity":{"type":"integer","minimum":1,"maximum":50}}}}}},"responses":{"202":{"description":"Request sent to the Project Blue team."}}}},"/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"},"variables":{"type":"object","additionalProperties":{"type":"string"},"maxProperties":50,"propertyNames":{"type":"string","pattern":"^[a-zA-Z0-9_]+$"},"description":"Optional string values for this run. first_name, last_name, email, and company override the matching core tokens; every other key is {{custom.<key>}}. first_name and last_name create the Project Blue contact only when no CRM is connected. CRM accounts never get a Project Blue contact from enrollment. Keys are case insensitive. Max 50 keys; max 500 characters per value."}}}}}},"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 or an inbound FaceTime webhook.","schema":{"type":"string"}}],"responses":{"200":{"description":"Call status.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"call_uuid":{"type":"string"},"call_status":{"type":"string"},"direction":{"type":"string","enum":["inbound","outbound"]},"address":{"type":"string"},"ringing_at":{"type":["string","null"],"format":"date-time"},"answered_at":{"type":["string","null"],"format":"date-time"},"ended_at":{"type":["string","null"],"format":"date-time"}}}}}},"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."}}}}}}}}},"/answer-facetime-call-api":{"post":{"operationId":"answerFacetimeCall","tags":["Calls"],"summary":"Answer an inbound FaceTime Audio call","description":"Answers a ringing inbound FaceTime Audio call and returns Agora credentials. Succeeds only while call_status is ringing. agora can be null on a 200. Inbound call webhooks (facetime.inbound.ringing, facetime.inbound.answered, facetime.inbound.ended) are documented at https://api.tryprojectblue.com/#facetime-inbound.","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 answered.","content":{"application/json":{"schema":{"type":"object","required":["success","call_uuid"],"properties":{"success":{"type":"boolean"},"call_uuid":{"type":"string"},"agora":{"type":["object","null"],"properties":{"appId":{"type":"string"},"channelName":{"type":"string"},"token":{"type":"string"},"uid":{"type":"number"}}}}}}}},"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."}}}}}},"503":{"description":"HTTP 503 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."}}}}}}}}},"/decline-facetime-call-api":{"post":{"operationId":"declineFacetimeCall","tags":["Calls"],"summary":"Decline an inbound FaceTime Audio call","description":"Declines a ringing inbound FaceTime Audio call. If the caller already hung up, already disconnected from the Mac is treated as success. Succeeds only while call_status is ringing.","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 declined.","content":{"application/json":{"schema":{"type":"object","required":["success","call_uuid"],"properties":{"success":{"type":"boolean"},"call_uuid":{"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."}}}}}},"503":{"description":"HTTP 503 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."}}}}}}}}},"/set-contact-card":{"post":{"operationId":"setContactCard","tags":["Contact cards"],"summary":"Create or update a line's iMessage name and photo","description":"Sets the name and photo recipients see for a line. firstName and lastName are required on the first call; later calls may send any subset. imageUrl (https) or imageBase64 replaces the photo, imageUrl: null removes it, omitting both keeps it. Read `status`, not the HTTP code: APPLIED (200), PARTIAL (200, name landed but not the photo), FAILED (4xx/502), INDETERMINATE (504 — call getContactCard before retrying). Supports an Idempotency-Key header. Unavailable on trial accounts.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Identical requests without it are collapsed for a short window; pass a new key to force a repeat.","schema":{"type":"string","maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["lineId"],"properties":{"lineId":{"type":"string","format":"uuid"},"firstName":{"type":"string","minLength":1,"maxLength":64},"lastName":{"type":"string","minLength":1,"maxLength":64},"imageUrl":{"oneOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"https URL of the photo, or null to remove it."},"imageBase64":{"type":"string","description":"Base64 (or data: URL) photo. Mutually exclusive with imageUrl."}}}}}},"responses":{"200":{"description":"Outcome of the update. `status` is APPLIED, PARTIAL, FAILED or INDETERMINATE.","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."}}}}}},"503":{"description":"The line did not answer. Nothing was changed; retry shortly.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"504":{"description":"INDETERMINATE — the line did not confirm. Read the card back before assuming anything.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/get-contact-card":{"get":{"operationId":"getContactCard","tags":["Contact cards"],"summary":"Read a line's stored and live contact card","description":"Returns the card Project Blue stored for the line and what Messages on the line currently holds, read live. `line.state` is APPLIED when they match, MISMATCH when they differ, NOT_SET, UNMANAGED, or UNAVAILABLE when the line could not be read. Call this after an INDETERMINATE set.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"parameters":[{"name":"lineId","in":"query","required":true,"description":"lineId from getLines.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Stored card plus live line state.","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."}}}}}}}}},"/share-contact-card":{"post":{"operationId":"shareContactCard","tags":["Contact cards"],"summary":"Share a line's contact card into an existing conversation","description":"Sends the line's saved name and photo to one destination so Messages on their side offers to update the contact. The 1:1 iMessage conversation must already exist (404 CHAT_NOT_FOUND otherwise — send a message first). `status` SHARED means the line accepted the send, not that the recipient displays it; INDETERMINATE (504) means the line did not answer and the card may or may not have gone out — do not blindly retry. Supports an Idempotency-Key header. Unavailable on trial accounts.","security":[{"bearerAuth":[]},{"oauth2":["mcp"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional. Without it, the same line + destination + card revision is collapsed for a short window; pass a new key to reshare deliberately.","schema":{"type":"string","maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["lineId","destination"],"properties":{"lineId":{"type":"string","format":"uuid"},"destination":{"type":"string","description":"Phone number (normalised to E.164) or iMessage email address."}}}}}},"responses":{"200":{"description":"Outcome of the share. `status` is SHARED, FAILED or INDETERMINATE.","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."}}}}}},"503":{"description":"The line did not answer. Nothing was changed; retry shortly.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"504":{"description":"INDETERMINATE — the line did not confirm. Read the card back before assuming anything.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/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"}}