{"openapi":"3.1.0","info":{"title":"ppl agent API","version":"1.5.1","description":"REST API for ppl, the personal CRM for humans with AI agents. Most agents should use the hosted MCP server at https://withppl.com/mcp (120 tools). Full guide: https://withppl.com/agents","contact":{"url":"https://withppl.com/contact"},"x-compatibility-policy":"The API is currently unversioned and in beta. Existing response shapes and status codes are preserved; clients should tolerate additive fields. No guaranteed deprecation window is promised. Check the developer guide and rediscover schemas after updates.","termsOfService":"https://withppl.com/terms"},"servers":[{"url":"https://withppl.com/api"}],"security":[{"bearer":[]},{"oauth2":[]}],"components":{"schemas":{"AgentErrorHint":{"type":"object","required":["code","resolution","retryable"],"properties":{"code":{"type":"string"},"resolution":{"type":"string"},"retryable":{"type":"boolean","description":"False for uncertain write outcomes; verify the result before replaying a write."},"retry_after_seconds":{"type":"integer","minimum":0,"description":"Optional parsed Retry-After delay for 429 or 503."}},"description":"Optional additive REST recovery hints. Existing error fields and HTTP status remain authoritative."},"LegacyApiError":{"type":"object","required":["error"],"properties":{"agent_error":{"$ref":"#/components/schemas/AgentErrorHint"},"error":{"type":"object","required":["message","error_code"],"properties":{"message":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"error_code":{"type":"integer"}}}},"description":"Legacy errors retain numeric error.error_code and a message or list of validation messages."},"FrameworkApiError":{"type":"object","required":["message"],"properties":{"agent_error":{"$ref":"#/components/schemas/AgentErrorHint"},"message":{"type":"string"},"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"description":"Framework authentication, authorization, validation, missing-route and throttling errors. Send Accept: application/json."},"AgentAccessError":{"type":"object","required":["error"],"properties":{"agent_error":{"$ref":"#/components/schemas/AgentErrorHint"},"error":{"type":"string"},"message":{"type":"string"},"required_scope":{"type":"string"},"action_type":{"type":"string"}},"description":"Agent access/connect errors including insufficient_scope, agent_paused, policy_denied and approval_required. Fields depend on the failure."},"ApiError":{"anyOf":[{"$ref":"#/components/schemas/LegacyApiError"},{"$ref":"#/components/schemas/FrameworkApiError"},{"$ref":"#/components/schemas/AgentAccessError"}],"description":"Existing REST variants; use HTTP status then the available error field. These are not OAuth or MCP JSON-RPC errors. Additional fields may appear."}},"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Connect-flow token, personal API key, or OAuth access token"},"oauth2":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"https://withppl.com/oauth/authorize","tokenUrl":"https://withppl.com/oauth/token","refreshUrl":"https://withppl.com/oauth/token","scopes":{"agent:briefing":"ppl scope","agent:actions":"ppl scope","agent:search":"ppl scope","read:contacts":"ppl scope","write:contacts":"ppl scope","read:journal":"ppl scope","write:journal":"ppl scope","read:tasks":"ppl scope","write:tasks":"ppl scope","message:send":"ppl scope","message:read":"ppl scope","circles:read":"ppl scope","circles:write":"ppl scope"}}}}}},"paths":{"/agent/connect/request":{"post":{"operationId":"requestConnection","summary":"Start the one-approval connect flow (no auth). Returns approve_url for the human and poll_url for the agent.","tags":["connect"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"client_name":{"type":"string","description":"Your agent name"},"redirect_uri":{"type":"string","description":"Optional URL the human returns to after approving"}},"required":["client_name"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/agent/connect/{id}/status":{"get":{"operationId":"connectionStatus","summary":"Poll a connect request. When approved, the first poll returns api_token exactly once.","tags":["connect"],"security":[],"parameters":[{"name":"id","in":"path","required":true,"description":"Connect request id","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/agent/preview":{"get":{"operationId":"previewBriefing","summary":"Synthetic sample briefing, no auth. Show it before asking the human to connect.","tags":["agent"],"security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/agent/briefing":{"get":{"operationId":"getBriefing","summary":"Daily briefing: birthdays, reconnect candidates, open tasks, reminders","tags":["agent"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/agent/next-action":{"get":{"operationId":"getNextAction","summary":"The single highest-leverage relationship action, with a drafted message","tags":["agent"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/agent/actions":{"get":{"operationId":"getSuggestedActions","summary":"Ranked suggested actions with scores, reasons, and deep links","tags":["agent"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/agent/ask":{"post":{"operationId":"askMemory","summary":"Ask a natural language question about the human's people","tags":["agent"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"question":{"type":"string","description":"The question, up to 500 characters"}},"required":["question"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/agent/inbox":{"get":{"operationId":"getAgentInbox","summary":"Claimable work queue for background agents","tags":["agent"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/search/semantic":{"get":{"operationId":"semanticSearch","summary":"Semantic search across contacts, notes, and journal (keyword fallback)","tags":["search"],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":255}},{"name":"limit","in":"query","schema":{"type":"integer","maximum":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/interactions/log":{"post":{"operationId":"logInteraction","summary":"Log an interaction; returns relationship impact (before and after status)","tags":["interactions"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact_id":{"type":"integer","description":"Contact id"},"type":{"type":"string","enum":["email","meeting","call","message"]},"occurred_at":{"type":"string","format":"date-time"},"subject":{"type":"string","description":"Short subject"},"summary":{"type":"string","description":"What happened"}},"required":["contact_id","type"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/contacts/{contact}/digest":{"get":{"operationId":"getPersonDigest","summary":"Everything known about one person: summary, last interaction, open tasks, milestones","tags":["contacts"],"parameters":[{"name":"contact","in":"path","required":true,"description":"Contact id","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/contacts/{contact}/timeline":{"get":{"operationId":"getContactTimeline","summary":"Chronological timeline for one person","tags":["contacts"],"parameters":[{"name":"contact","in":"path","required":true,"description":"Contact id","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/contacts/{contact}/communication-style":{"get":{"operationId":"getCommunicationStyle","summary":"A contact's preferred channel, tone notes, and formality","tags":["contacts"],"parameters":[{"name":"contact","in":"path","required":true,"description":"Contact id","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/contacts/check-duplicates":{"post":{"operationId":"checkDuplicates","summary":"Check whether a person already exists before creating them","tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"first_name":{"type":"string","description":"First name"},"last_name":{"type":"string","description":"Last name"},"email":{"type":"string","description":"Email"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/account/voice-profile":{"get":{"operationId":"getVoiceProfile","summary":"The human's writing voice (tone, greeting, signoff); read before drafting messages","tags":["account"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/contacts":{"get":{"operationId":"listContacts","summary":"List contacts","tags":["contacts"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","maximum":100},"description":"Page size"},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Page number"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createContact","summary":"Create a contact","tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"first_name":{"type":"string","description":"First name"},"last_name":{"type":"string","description":"Last name"},"nickname":{"type":"string","description":"Nickname"},"gender_id":{"type":"integer","description":"Gender id (see schema.describe)"},"is_birthdate_known":{"type":"boolean"},"is_deceased":{"type":"boolean"},"is_deceased_date_known":{"type":"boolean"}},"required":["first_name"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/contacts/{id}":{"get":{"operationId":"getContact","summary":"Get one contact","tags":["contacts"],"parameters":[{"name":"id","in":"path","required":true,"description":"Contact id","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"put":{"operationId":"updateContact","summary":"Update a contact","tags":["contacts"],"parameters":[{"name":"id","in":"path","required":true,"description":"Contact id","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"first_name":{"type":"string","description":"First name"},"last_name":{"type":"string","description":"Last name"},"nickname":{"type":"string","description":"Nickname"},"gender_id":{"type":"integer","description":"Gender id (see schema.describe)"},"is_birthdate_known":{"type":"boolean"},"is_deceased":{"type":"boolean"},"is_deceased_date_known":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteContact","summary":"Delete a contact","tags":["contacts"],"parameters":[{"name":"id","in":"path","required":true,"description":"Contact id","schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/notes":{"get":{"operationId":"listNotes","summary":"List notes","tags":["notes"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","maximum":100},"description":"Page size"},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Page number"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createNote","summary":"Create a note","tags":["notes"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact_id":{"type":"integer","description":"Contact id"},"body":{"type":"string","description":"Note text"},"is_favorited":{"type":"boolean"}},"required":["contact_id","body"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/notes/{id}":{"get":{"operationId":"getNote","summary":"Get one note","tags":["notes"],"parameters":[{"name":"id","in":"path","required":true,"description":"Note id","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"put":{"operationId":"updateNote","summary":"Update a note","tags":["notes"],"parameters":[{"name":"id","in":"path","required":true,"description":"Note id","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact_id":{"type":"integer","description":"Contact id"},"body":{"type":"string","description":"Note text"},"is_favorited":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteNote","summary":"Delete a note","tags":["notes"],"parameters":[{"name":"id","in":"path","required":true,"description":"Note id","schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tasks":{"get":{"operationId":"listTasks","summary":"List tasks","tags":["tasks"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","maximum":100},"description":"Page size"},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Page number"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createTask","summary":"Create a task","tags":["tasks"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact_id":{"type":"integer","description":"Contact id (optional)"},"title":{"type":"string","description":"Task title"},"description":{"type":"string","description":"Details"},"completed":{"type":"boolean"}},"required":["title"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tasks/{id}":{"get":{"operationId":"getTask","summary":"Get one task","tags":["tasks"],"parameters":[{"name":"id","in":"path","required":true,"description":"Task id","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"put":{"operationId":"updateTask","summary":"Update a task","tags":["tasks"],"parameters":[{"name":"id","in":"path","required":true,"description":"Task id","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact_id":{"type":"integer","description":"Contact id (optional)"},"title":{"type":"string","description":"Task title"},"description":{"type":"string","description":"Details"},"completed":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteTask","summary":"Delete a task","tags":["tasks"],"parameters":[{"name":"id","in":"path","required":true,"description":"Task id","schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/reminders":{"get":{"operationId":"listReminders","summary":"List reminders","tags":["reminders"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","maximum":100},"description":"Page size"},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Page number"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createReminder","summary":"Create a reminder","tags":["reminders"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact_id":{"type":"integer","description":"Contact id"},"title":{"type":"string","description":"Reminder title"},"initial_date":{"type":"string","format":"date"},"frequency_type":{"type":"string","enum":["one_time","week","month","year"]},"frequency_number":{"type":"integer"}},"required":["contact_id","title","initial_date","frequency_type","frequency_number"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/reminders/{id}":{"get":{"operationId":"getReminder","summary":"Get one reminder","tags":["reminders"],"parameters":[{"name":"id","in":"path","required":true,"description":"Reminder id","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"put":{"operationId":"updateReminder","summary":"Update a reminder","tags":["reminders"],"parameters":[{"name":"id","in":"path","required":true,"description":"Reminder id","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact_id":{"type":"integer","description":"Contact id"},"title":{"type":"string","description":"Reminder title"},"initial_date":{"type":"string","format":"date"},"frequency_type":{"type":"string","enum":["one_time","week","month","year"]},"frequency_number":{"type":"integer"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteReminder","summary":"Delete a reminder","tags":["reminders"],"parameters":[{"name":"id","in":"path","required":true,"description":"Reminder id","schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/journal":{"get":{"operationId":"listJournal","summary":"List journal","tags":["journal"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","maximum":100},"description":"Page size"},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Page number"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createJournalEntry","summary":"Create a journalEntry","tags":["journal"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Entry title"},"post":{"type":"string","description":"Entry body"},"date":{"type":"string","format":"date"}},"required":["title","post"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/journal/{id}":{"get":{"operationId":"getJournalEntry","summary":"Get one journalEntry","tags":["journal"],"parameters":[{"name":"id","in":"path","required":true,"description":"JournalEntry id","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"put":{"operationId":"updateJournalEntry","summary":"Update a journalEntry","tags":["journal"],"parameters":[{"name":"id","in":"path","required":true,"description":"JournalEntry id","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Entry title"},"post":{"type":"string","description":"Entry body"},"date":{"type":"string","format":"date"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteJournalEntry","summary":"Delete a journalEntry","tags":["journal"],"parameters":[{"name":"id","in":"path","required":true,"description":"JournalEntry id","schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/webhooks":{"get":{"operationId":"listWebhooks","summary":"List webhooks","tags":["webhooks"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","maximum":100},"description":"Page size"},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Page number"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"post":{"operationId":"createWebhook","summary":"Create a webhook","tags":["webhooks"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"HTTPS endpoint that receives events"},"events":{"type":"array","items":{"type":"string"}}},"required":["url","events"]}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/webhooks/{id}":{"get":{"operationId":"getWebhook","summary":"Get one webhook","tags":["webhooks"],"parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"put":{"operationId":"updateWebhook","summary":"Update a webhook","tags":["webhooks"],"parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"HTTPS endpoint that receives events"},"events":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}},"delete":{"operationId":"deleteWebhook","summary":"Delete a webhook","tags":["webhooks"],"parameters":[{"name":"id","in":"path","required":true,"description":"Webhook id","schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request. Correct malformed JSON or unsupported query parameters. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"401":{"description":"Token invalid or authentication required. Refresh through OAuth when supported; otherwise reconnect with human approval. Never log the credential. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Access denied. For insufficient_scope, request owner-approved reconnection with the required permission. For agent_paused, ask the owner to resume it in My agents. For policy_denied, respect the policy; retrying will not grant access. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"404":{"description":"Resource or route not found. Check the documented route and resolve the intended record within this account. Do not try IDs from other accounts. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"409":{"description":"Conflict or approval_required. Resolve the conflict before retrying. REST cannot consume MCP approvals; request approval and execute the exact reviewed MCP tool with its approval_id. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"422":{"description":"Validation failed. Correct supplied fields using errors or error.message and the request schema. Do not repeat unchanged input. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited. Respect Retry-After when present; otherwise back off with jitter. Do not run parallel retries. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"500":{"description":"Server error. Back off. A failed write response does not prove the write was rolled back; check the outcome before retrying to avoid duplicates. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Temporarily unavailable or maintenance. Respect Retry-After when present and back off. Check the outcome of writes before replaying them. Optional agent_error adds recovery hints without replacing existing fields.","headers":{"RateLimit-Limit":{"description":"Optional valid limit mirrored from X-RateLimit-Limit.","schema":{"type":"integer","minimum":1}},"RateLimit-Remaining":{"description":"Optional valid remaining count mirrored from X-RateLimit-Remaining; no reset time is inferred.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Optional delay in seconds or HTTP date; honor it before retrying.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}}}