{"openapi":"3.1.0","x-api-id":"82f54a4e-6391-4ce2-8cb3-e906e1f696e9","x-audience":"external-public","info":{"title":"Marky Public API","version":"2026-08-06","description":"Create and schedule posts, manage businesses, library, media, and webhooks.\n\n## Versioning\nThe API uses dated versions (Stripe-style). Send an optional `Marky-Version` request header to opt into a version; the response echoes the version it was served as. Unpinned requests stay on the floor (2026-04-08) forever, so existing integrations never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes; unknown values fall back to the floor. Full docs: https://docs.mymarky.ai.\n\n## Tolerant reader\nBe a tolerant reader: **ignore unknown fields** in responses (we add fields additively, without a version bump) and **tolerate unknown enum values** for growing sets like platforms, AI models, statuses, and error codes (marked `x-extensible-enum` in this schema). Do not hard-fail on either — treat an unrecognized enum value as an opaque string.\n\n## Hypermedia\nResponses on the newest version (from 2026-07-17) carry a `self` link — the absolute URL of the resource (single reads/updates) or the current page (collections) — so you can navigate without rebuilding URLs. Newly created resources return their canonical URL in the `Location` header instead.","termsOfService":"https://www.mymarky.ai/legal/terms-and-conditions","contact":{"name":"Marky API Support","url":"https://docs.mymarky.ai","email":"support@mymarky.ai"},"license":{"name":"Proprietary — © Marky. All rights reserved.","url":"https://www.mymarky.ai/legal/terms-and-conditions"}},"externalDocs":{"description":"Marky API docs","url":"https://docs.mymarky.ai"},"servers":[{"url":"https://api.mymarky.ai","description":"Production"}],"paths":{"/api/businesses/{business_id}/posts/generate":{"post":{"tags":["posts"],"summary":"Generate posts","description":"Generate social media posts from your content. DEPRECATED — prefer `create_post`.\n\nPrefer `create_post`: author the caption (and pick media) yourself and push\nthe post in directly — you get full control and it's free. Use THIS\nserver-side generation pipeline only when the user explicitly asks Marky to\nwrite/design the content for them. It spends credits and counts against the\norg's monthly post quota.\n\nProvide text content, a website URL, or a custom idea and we'll create\nvisual social posts as drafts in your queue. Returns a job ID — poll\n`GET /api/businesses/{business_id}/jobs/{job_id}` until status is `completed`\nor `failed`.\n\n**Rate limits:** 100 requests/minute, 2,000/day, 10,000/week; 200 posts/month per org.\n\nErrors:\n    400 missing_field: None of content, website_url, or custom_idea was given.\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You hit the per-minute rate limit or the monthly post quota.","operationId":"generate_draft_posts","deprecated":true,"security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRequest"}}}},"responses":{"202":{"description":"Generation job created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/jobs/{job_id}":{"get":{"tags":["businesses"],"summary":"Get job status","description":"Poll a generation job for completion.\n\nReturns `pending` while generating, `completed` with posts data when done,\nor `failed` with an error message. Poll every 2-5 seconds.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No job with that ID exists, or it is not in this business.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_job_status","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"job_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Job Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/posts":{"get":{"tags":["posts"],"summary":"List posts","description":"List posts for a business, newest first. Use cursor for pagination.\n\nPass `view=summary` for a lightweight payload (caption preview + media\nfingerprint, no publish_results/overrides/queue) when auditing or de-duping a\nbig history — a full-view page of 100 posts can be too large for an agent's\ntool budget.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_posts","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["NEW","SCHEDULED","PUBLISHED","DRAFT","REJECTED"],"type":"string"}},{"type":"null"}],"description":"Filter by post status. Repeat it to get several at once (`status=NEW&status=DRAFT` returns both). NEW = draft awaiting your team's review (incl. freshly generated posts), DRAFT = approved by a reviewer on your team, REJECTED = declined by a reviewer, SCHEDULED = queued for a future time, PUBLISHED = already posted. DRAFT/REJECTED are your team's review verdicts — Marky does not gate publishing on them.","title":"Status"},"description":"Filter by post status. Repeat it to get several at once (`status=NEW&status=DRAFT` returns both). NEW = draft awaiting your team's review (incl. freshly generated posts), DRAFT = approved by a reviewer on your team, REJECTED = declined by a reviewer, SCHEDULED = queued for a future time, PUBLISHED = already posted. DRAFT/REJECTED are your team's review verdicts — Marky does not gate publishing on them."},{"name":"post_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"},"maxItems":100},{"type":"null"}],"description":"Return only these posts (up to 100; repeat the param). With the default `view=full` each item is exactly what `get_post` returns, so this is the way to read several posts in one call. Ids from another business are left out, not an error. Combines with `status`; cannot be combined with `q`.","title":"Post Ids"},"description":"Return only these posts (up to 100; repeat the param). With the default `view=full` each item is exactly what `get_post` returns, so this is the way to read several posts in one call. Ids from another business are left out, not an error. Combines with `status`; cannot be combined with `q`."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results per page (1-100)","default":20,"title":"Limit"},"description":"Max results per page (1-100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Keyword search. Returns only posts whose caption, title, or attached media's description/transcript contains this text (case-insensitive). Searching the media description is what finds 'the post about my dog' when the dog is in the image and the caption never says 'dog'. Trashed (REJECTED) posts are left out — pass `status=REJECTED` to search them. Combines with `status`, and pages with `cursor` just like an unfiltered listing.","title":"Q"},"description":"Keyword search. Returns only posts whose caption, title, or attached media's description/transcript contains this text (case-insensitive). Searching the media description is what finds 'the post about my dog' when the dog is in the image and the caption never says 'dog'. Trashed (REJECTED) posts are left out — pass `status=REJECTED` to search them. Combines with `status`, and pages with `cursor` just like an unfiltered listing."},{"name":"view","in":"query","required":false,"schema":{"enum":["full","summary"],"type":"string","description":"Response detail. `full` (default) returns each post's whole caption plus publish_results, platform_overrides, and queue placement. `summary` returns a lean row — caption PREVIEW, media count + fingerprint, status, schedule, and metadata — with none of the heavy fields, for cheaply scanning or de-duping a large history without blowing your token budget.","default":"full","title":"View"},"description":"Response detail. `full` (default) returns each post's whole caption plus publish_results, platform_overrides, and queue placement. `summary` returns a lean row — caption PREVIEW, media count + fingerprint, status, schedule, and metadata — with none of the heavy fields, for cheaply scanning or de-duping a large history without blowing your token budget."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/Page_PostResponse_"},{"$ref":"#/components/schemas/Page_PostSummaryResponse_"}],"title":"Response List Posts"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"post":{"tags":["posts"],"summary":"Create post","description":"Create a post directly without using the generation pipeline.\n\nUse this when you generate content externally (e.g. with your own AI agent)\nand want to push it in for scheduling and publishing.\n\nSend an `Idempotency-Key` header to make a retry safe: if your request times\nout and you resend it with the same key, you get the original post back\ninstead of a duplicate — so a network blip never double-posts.\n\nErrors:\n    400 missing_field: status is SCHEDULED but scheduled_publish_time was not given.\n    400 invalid_request: scheduled_publish_time is not in the future.\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    409 MEDIA_RECENTLY_USED: (Marky's assistant only) a library photo in media_ids is already on another recent post. API-key callers get a `media_recently_used` warning instead.\n    422 IDEMPOTENCY_KEY_CONFLICT: The Idempotency-Key was reused with a different body.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"create_post","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Location":{"description":"Absolute URL of the newly created resource.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"409":{"description":"Conflict — a resource like this already exists.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"patch":{"tags":["posts"],"summary":"Update posts","description":"Update many posts in one call: explicit edits, or one text replace across matching posts.\n\nTwo shapes:\n  - `items`: a list of update_post edits, each with its post_id. Applied now,\n    one result per item.\n  - `match` + `set.caption_replace`: \"change X to Y in every post that has\n    it\". The first call is a dry run: it writes nothing and returns how many\n    posts would change, up to 5 before/after samples, the posts it will skip\n    and a `confirm_token`. Then send the SAME call with dry_run=false and that\n    confirm_token to apply. Only the matched text changes; status and schedule\n    never do, and published posts are never touched.\n\nErrors:\n    400 PREVIEW_REQUIRED: A rule apply (dry_run=false) came without a confirm_token.\n    400 invalid_request: The rule would change more than 200 posts; narrow match.q or match.statuses.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    409 PREVIEW_STALE: Posts changed since the dry run (or it was already applied). Nothing was written. Run the dry run again and apply with its new confirm_token.\n    422 validation_error: Both or neither of the two shapes, find shorter than 4 characters, or more than 50 items.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"update_posts","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePostsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePostsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/posts/{post_id}":{"get":{"tags":["posts"],"summary":"Get post","description":"Get a single post by ID, including per-platform publish results.\n\nThe post's business must belong to your org. `publish_results` is a list\nof outcomes — one per platform this post was sent to — with the external\n`publish_id` you'll need to fetch live stats. Poll this endpoint until\nevery entry has a terminal status (`success` or `failed`) to know\npublishing finished.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No post with that ID exists, or it is not in this business.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_post","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"patch":{"tags":["posts"],"summary":"Update post","description":"Update a post's caption, review status, target platforms, media, or platform overrides.\n\n`status` moves the post through YOUR TEAM's review workflow: set NEW to tell\nyour team the post is ready for their review (it appears on the app's review\npage), DRAFT to record a reviewer's approval, REJECTED to record a decline.\nMarky does not gate publishing on these — they are your team's workflow\nstate. Status can only change on posts currently in NEW, DRAFT, or REJECTED:\nscheduling has its own endpoint, and published posts are immutable.\n\n`platform_overrides` replaces the post's whole override set: send the full\nlist to keep, `[]` to clear, or omit the field to leave overrides untouched.\n\nErrors:\n    400 invalid_request: The post is already published, no fields were given to update, or status was sent for a post that is SCHEDULED, PUBLISHED, GENERATING, or FAILED.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No post with that ID exists, or it is not in this business.\n    409 MEDIA_RECENTLY_USED: (Marky's assistant only) media_ids adds a library photo that is already on another recent post. API-key callers get a `media_recently_used` warning instead.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"update_post","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"delete":{"tags":["posts"],"summary":"Delete post","description":"Delete a post.\n\nRemoves the post from Marky. Use this to discard a draft you no longer want\nor to clear a scheduled/queued post so it does not publish. This does NOT\ndelete anything already posted to a social platform — to keep that history\nintact, a post that has already been published cannot be deleted.\n\nErrors:\n    400 invalid_request: The post is already published, so it can't be deleted.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No post with that ID exists, or it is not in this business.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"delete_post","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/posts/{post_id}/schedule":{"post":{"tags":["posts"],"summary":"Schedule post","description":"Schedule a post for publishing at a specific time.\n\nThe post must be in NEW, DRAFT, or SCHEDULED status. Set `scheduled_publish_time` to a\nfuture datetime (ISO 8601). The post will be published automatically at that\ntime to all connected platforms, or to specific platforms if\n`restrict_publish_to` is set.\n\nFor a RECURRING / evergreen post, also set `repeating_cron` (a 5-field cron\nstring): `scheduled_publish_time` is the first run and Marky auto-creates the\nnext occurrence after each publish. This is the ONLY place recurrence is set —\nre-schedule with `repeating_cron: null` to stop it. Scheduling also clears any\nqueue placement (a post is either queued OR fixed-time, never both).\n\nErrors:\n    400 POST_ALREADY_PUBLISHED: The post is already live, so it can't be scheduled. Duplicate it and schedule the copy. Carries `published_at`.\n    400 invalid_request: The post status is not NEW, DRAFT, or SCHEDULED, or scheduled_publish_time is not in the future.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No post with that ID exists, or it is not in this business.\n    409 NO_CONNECTED_SOCIALS: No connected account can publish this post (none connected, all need a reconnect, or none can take this content). The post is NOT scheduled and is unchanged. Follow `recovery_hint` (usually: call connect_social), then schedule it again.\n    429 rate_limit_exceeded: You sent too many requests this minute.\n\nOn success, `publish_readiness` lists the platforms the post will publish to\nand any connected account that won't get it, with the reason.","operationId":"schedule_post","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostScheduleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/posts/{post_id}/publish":{"post":{"tags":["posts"],"summary":"Publish post now","description":"Publish a post immediately to its connected platforms.\n\nFires the publish flow in the background and returns the post right away.\nThe post's publish results land asynchronously in `post_publish_results` —\npoll `GET /api/businesses/{business_id}/posts/{post_id}` for the final\n`status` (`PUBLISHED` once all targeted platforms complete).\n\nErrors:\n    400 NO_CONNECTED_SOCIALS: This business has no connected accounts, or none of the requested platforms are connected.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No post with that ID exists, or it is not in this business.\n    409 CAPTION_HAS_PLACEHOLDER: The caption still has an unfilled [[placeholder]] (a fact only the owner knows). The post is NOT published and is unchanged. Fill it in with update_post, then publish it again.\n    409 NO_CONNECTED_SOCIALS: No connected account can publish this post (none connected, all need a reconnect, or none can take this content). The post is NOT published and is unchanged. Follow `recovery_hint` (usually: call connect_social), then publish it again. Being rolled out in place of the 400 above.\n    429 rate_limit_exceeded: You sent too many requests this minute.\n\nThe response's `publish_readiness` lists the platforms the post will\npublish to and any connected account that won't get it, with the reason.\n`delivery` on a later read says what actually landed.","operationId":"publish_post_now","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PostPublishRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"202":{"description":"Publish accepted; firing in background","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/posts/{post_id}/stats":{"get":{"tags":["posts"],"summary":"Get post stats","description":"Fetch per-platform analytics for a post published through Marky.\n\nReturns one entry per platform the post was successfully published to,\nwith metrics fetched live from each provider. Stats are normalized into a\nconsistent shape (`likes`, `comment_count`, `reach`, `views`, etc.) across\nFacebook, Instagram, LinkedIn, Twitter, TikTok, Pinterest, and YouTube.\nPlatforms we can't fetch (no success result, disconnected integration,\nexpired token) appear in `skipped`.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No post with that ID exists, or it is not in this business.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_post_analytics","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/src__routes__api_v1__PostStatsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/posts/schedule":{"post":{"tags":["posts"],"summary":"Schedule posts","description":"Schedule a list of posts in one call: queue them in order, or at local times.\n\n`mode=\"queue\"` (default) appends the posts to the business's posting queue\nIN THE ORDER YOU SEND THEM: the first id gets the next open slot. A post\nthat already carries a date (created with `scheduled_publish_time` while\nNEW) is scheduled at that date instead. `mode=\"at\"` publishes each post at\nthe matching `times_local`, a wall-clock time in the business's timezone;\nnever convert to UTC yourself.\n\nEach post is answered separately, in the order sent: `publish_time_local`\n(quote it verbatim), `warnings` (quote them too), or an `error` for that\npost only. One bad post never stops the rest. Calling again with posts that\nare already queued changes nothing (ALREADY_SCHEDULED). Every scheduled post\nreturns a `revision_id` for Undo. `queue` summarizes the queue afterwards,\nso no extra read is needed.\n\nErrors (per post, in `results[].error.code`): NOT_FOUND, POST_ALREADY_PUBLISHED,\nALREADY_SCHEDULED, NOT_SCHEDULABLE, CAPTION_HAS_PLACEHOLDER (fill the\n[[...]] first), NO_CONNECTED_SOCIALS (follow recovery_hint), MEDIA_REQUIRED,\nTIME_IN_PAST.\n\nErrors (whole call):\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    422 validation_error: No post_ids or more than 50, a malformed id, `times_local` missing or not one per post in `at` mode, or an unknown `timezone`.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"schedule_posts","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulePostsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulePostsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/posts/{post_id}/queue":{"post":{"tags":["posts"],"summary":"Add post to queue","description":"Add a post to the business's posting Queue.\n\nUse this instead of `schedule` when you want the post to go out at the next\nopen slot in the business's posting schedule, rather than at a fixed time you\npick. The post is appended to the end of the queue and publishes\nautomatically when its turn comes up — the same behavior as the \"Add to\nqueue\" button in the app. If the business has no queue yet, a default daily\nschedule is created for it. To queue several posts, use `schedule_posts`\nwith the ids in order: separate calls sent at once can't keep an order.\n\nA post that already carries a future date (created with\n`scheduled_publish_time` while NEW) keeps it: it is scheduled AT that date,\ncomes back with `scheduled_publish_time` set and `queue` null.\n\nA post whose caption names a day (`copy_date`, e.g. National Day) never goes\ninto a slot after that day: it is scheduled ON the day instead (warning\nSCHEDULED_ON_COPY_DATE, quote its time), or, when that day's time has passed,\nrefused with 409 COPY_DATE_BEFORE_NEXT_SLOT.\n\nThe post must not already be published. Otherwise, on success the post comes\nback with `status` = SCHEDULED, `scheduled_publish_time` = null, and a populated `queue`\nobject showing its position in line and estimated publish time. Poll\n`GET /api/businesses/{business_id}/posts/{post_id}` or\n`GET /api/businesses/{business_id}/queue` to confirm.\n\nErrors:\n    400 POST_ALREADY_PUBLISHED: The post is already live, so it can't be queued. Duplicate it and queue the copy. Carries `published_at`.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No post with that ID exists, or it is not in this business.\n    409 CAPTION_HAS_PLACEHOLDER: The caption still has an unfilled [[placeholder]] (a fact only the owner knows). The post is NOT queued and is unchanged. Fill it in with update_post, then queue it again.\n    409 NO_CONNECTED_SOCIALS: No connected account can publish this post (none connected, all need a reconnect, or none can take this content). The post is NOT queued and is unchanged, and no queue is created. Follow `recovery_hint` (usually: call connect_social), then queue it again.\n    409 COPY_DATE_BEFORE_NEXT_SLOT: The caption names a day (`copy_date`), the next queue slot (`next_slot_local`) is after it, and that day's posting time has passed. The post is NOT queued and is unchanged. Ask the user: publish_post_now, schedule_post at a time on or before the day, or queue again with ignore_copy_date=true.\n    429 rate_limit_exceeded: You sent too many requests this minute.\n\nOn success, `publish_readiness` lists the platforms the post will publish to\nand any connected account that won't get it, with the reason.","operationId":"queue_post","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Id"},"description":"A UUID identifier."},{"name":"ignore_copy_date","in":"query","required":false,"schema":{"type":"boolean","description":"Queue it even though the slot is after the day its caption names (COPY_DATE_BEFORE_NEXT_SLOT). Only when the user said so.","default":false,"title":"Ignore Copy Date"},"description":"Queue it even though the slot is after the day its caption names (COPY_DATE_BEFORE_NEXT_SLOT). Only when the user said so."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/moments":{"get":{"tags":["businesses"],"summary":"List upcoming moments","description":"List the dated moments coming up for a business, and which are already covered.\n\nPublic holidays of the business's country (from its holiday setting, else\nits timezone), curated marketing days, the first day of autumn/spring, and\nthe business's own `events` (set with update_business). Dates are on the\nbusiness's calendar; quote `date` and `weekday` as given.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    422 validation_error: `days` is not between 1 and 90.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_upcoming_moments","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"How many days ahead to look.","default":21,"title":"Days"},"description":"How many days ahead to look."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpcomingMomentsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/posts/batch":{"post":{"tags":["posts"],"summary":"Create posts","description":"Create several posts in one call, each exactly as create_post would.\n\nUse this instead of many create_post calls: \"a post a day for a month\" is\none call. Each item succeeds or fails on its own, so read `results`: an\nitem that failed says why in `error`, and nothing was saved for it.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    422 validation_error: No posts, more than 50, or an item is not a valid create_post body.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"create_posts","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePostsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePostsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/posts/{post_id}/comments":{"get":{"tags":["posts"],"summary":"List post comments","description":"List your team's review comments on a post, newest first.\n\nThese are the notes your team leaves while reviewing the post in the app —\nthe same thread the app's review page shows. Use them to read back WHY a\nreviewer approved (DRAFT) or declined (REJECTED) a post. Use cursor for\npagination.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No post with that ID exists, or it is not in this business.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_post_comments","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Id"},"description":"A UUID identifier."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results per page (1-100)","default":50,"title":"Limit"},"description":"Max results per page (1-100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_PostCommentResponse_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"post":{"tags":["posts"],"summary":"Add post comment","description":"Add a comment to a post's review thread.\n\nThe comment shows up on the post in the app, where your team reviews posts.\nUse it to give reviewers context (\"swap the image before approving\") or to\nreply to their feedback. The comment is attributed to your user account —\nwith an API key, that is the team member who created the key.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No post with that ID exists, or it is not in this business.\n    422: The body is missing, empty, or longer than 2000 characters.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"create_post_comment","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostCommentCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostCommentResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/posts/{post_id}/comments/{comment_id}":{"patch":{"tags":["posts"],"summary":"Resolve post comment","description":"Mark a review comment as handled, or reopen it.\n\nSet `resolved` to true once your team has acted on the feedback (e.g. the\ncaption was fixed), or false to reopen it. Resolving is your team's own\nbookkeeping — it does not change the post or its status.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No post or comment with that ID exists, or it is not in this business.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"resolve_post_comment","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Id"},"description":"A UUID identifier."},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Comment Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostCommentResolveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostCommentResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/post-ideas":{"get":{"tags":["businesses"],"summary":"List post ideas","description":"List a business's saved post ideas.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_post_ideas","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results per page (1-100)","default":20,"title":"Limit"},"description":"Max results per page (1-100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_PostIdeaResponse_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"post":{"tags":["businesses"],"summary":"Create post idea","description":"Save a new post idea (a content seed) for a business.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"create_post_idea","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostIdeaCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostIdeaResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/post-ideas/{post_idea_id}":{"get":{"tags":["businesses"],"summary":"Get post idea","description":"Get a single post idea.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this idea is not in your org.\n    404 resource_not_found: No post idea with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_post_idea","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_idea_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Idea Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostIdeaResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"patch":{"tags":["businesses"],"summary":"Update post idea","description":"Update a post idea (edit the text, retarget the topic, or bookmark).\n\nErrors:\n    400 invalid_request: No fields were given to update.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this idea is not in your org.\n    404 resource_not_found: No post idea with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"update_post_idea","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_idea_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Idea Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostIdeaUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostIdeaResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"delete":{"tags":["businesses"],"summary":"Delete post idea","description":"Soft-delete a post idea.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this idea is not in your org.\n    404 resource_not_found: No post idea with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"delete_post_idea","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_idea_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Idea Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/recipes":{"get":{"tags":["businesses"],"summary":"List recipes","description":"List a business's saved generation recipes (presets).\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_recipes","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results per page (1-100)","default":20,"title":"Limit"},"description":"Max results per page (1-100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_RecipeResponse_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"post":{"tags":["businesses"],"summary":"Create recipe","description":"Save a new generation recipe (preset) for a business.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"create_recipe","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipeCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipeResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/recipes/{recipe_id}":{"get":{"tags":["businesses"],"summary":"Get recipe","description":"Get a single recipe (preset).\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this recipe is not in your org.\n    404 resource_not_found: No recipe with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_recipe","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"recipe_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Recipe Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipeResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"patch":{"tags":["businesses"],"summary":"Update recipe","description":"Update a recipe (preset). PATCH merge — only the fields you send change.\n\nErrors:\n    400 invalid_request: No fields were given to update.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this recipe is not in your org.\n    404 resource_not_found: No recipe with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"update_recipe","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"recipe_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Recipe Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipeUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipeResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses":{"get":{"tags":["businesses"],"summary":"List businesses","description":"List the businesses (workspaces) you can access.\n\nAn API key sees its organization's businesses. A signed-in user sees every\nbusiness in an org they own or administer, plus only the specific businesses\nthey were added to in an org where they are a guest.\n\nSTART HERE: every other endpoint takes a required business_id, and this is\nthe tool that returns them — an agent with no business_id in context begins\nwith this call. Returns SUMMARY rows only (id, name, description, industry,\nwebsite, language, timestamps), newest first. To read a business's full\nbrand profile (tone, palettes, fonts, logo, writing rules), call\nget_business with the id from this list. Optional `name` narrows the list\nby case-insensitive substring match. If `next` is set, keep paging with it\nbefore concluding a business doesn't exist.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_businesses","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results per page (1-100)","default":100,"title":"Limit"},"description":"Max results per page (1-100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by name, case-insensitive substring (e.g. \"bakery\" matches \"Eli's Bakery\").","title":"Name"},"description":"Filter by name, case-insensitive substring (e.g. \"bakery\" matches \"Eli's Bakery\")."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_BusinessSummaryResponse_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"post":{"tags":["businesses"],"summary":"Create business","description":"Create a new business in your organization.\n\nSend an `Idempotency-Key` header to make a retry safe (a resend with the same\nkey returns the original business instead of creating a duplicate).\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access.\n    403 WORKSPACE_LIMIT_EXCEEDED: You hit your plan's workspace limit. Carries an\n        `upgrade_url` (one-click \"add a workspace\" screen) and `workspace_limit`.\n    422 IDEMPOTENCY_KEY_CONFLICT: The Idempotency-Key was reused with a different body.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"create_business","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Location":{"description":"Absolute URL of the newly created resource.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"409":{"description":"Conflict — a resource like this already exists.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}":{"get":{"tags":["businesses"],"summary":"Get business","description":"Get the FULL profile of a single business. Must belong to your org.\n\nThis is the detail read: it returns everything list_businesses leaves out —\nthe complete brand profile (tone, audience, caption writing rules, palettes,\nfonts, logo, per-platform writing instructions) on top of the summary\nfields. Use list_businesses to find a business_id; use this to read the\nbusiness itself.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_business","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"patch":{"tags":["businesses"],"summary":"Update business","description":"Update a business. Only provided fields are changed.\n\nChanging caption_suffix, website or logo_url does not rewrite posts that\nare already made. `propagation` says how many unpublished posts still carry\nthe old value and, for text, gives the update_posts call that fixes them.\n\nErrors:\n    400 invalid_request: No fields were given to update.\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    409 NAME_MATCHES_OTHER_WORKSPACE: Another business in your org already has that name. Nothing was saved. Send allow_duplicate_name=true to rename anyway.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"update_business","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessUpdateResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"delete":{"tags":["businesses"],"summary":"Delete business","description":"Soft-delete a business. Sets deleted_at timestamp.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"delete_business","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/integrations":{"get":{"tags":["integrations"],"summary":"List connected social accounts","description":"List the SOCIAL ACCOUNTS connected to this business (Facebook, Instagram, LinkedIn, TikTok, etc.) — NOT the business's posts or other workspaces.\n\nReturns one entry per connected account (Facebook, Instagram, LinkedIn,\nTwitter/X, TikTok, Pinterest, YouTube, Google Business), newest first. Use\ncursor for pagination. Use the returned `id` with\n`GET /businesses/{business_id}/integrations/{integration_id}/posts` to fetch\nposts from that account.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_connected_social_accounts","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results per page (1-100)","default":20,"title":"Limit"},"description":"Max results per page (1-100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_IntegrationResponse_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/queue":{"get":{"tags":["posts"],"summary":"List queued posts","description":"List the POSTS currently queued into this business's upcoming publish slots (what's lined up to go out). Distinct from get_posting_schedule (the recurring slot template) and get_queue_summary (aggregate fullness).\n\nEach entry shows the post's position in the queue and the estimated time it\nwill publish (projected from the queue's recurring timeslots — approximate,\nsince it ignores jitter and skipped slots). Posts scheduled for an exact time\nvia `schedule` (adhoc) are NOT in this list; only daily-queue posts are.\nFor just \"how full is the queue / when does it run dry\", use\n`GET /businesses/{business_id}/queue/summary` instead of paging this list.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    400 invalid_request: The cursor is malformed.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_queued_posts","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results per page (1-100)","default":20,"title":"Limit"},"description":"Max results per page (1-100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueuedPostsPage"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/queue/summary":{"get":{"tags":["posts"],"summary":"Get queue summary","description":"Report how full the daily queue is and when it runs dry.\n\nOne cheap call for \"do I need to top up my queue?\" checks: the number of\nqueued posts plus the estimated publish times of the next and LAST posts in\nthe queue. `last_estimated_publish_time` is the projected run-out moment —\nafter it, nothing more publishes until new posts are queued. Times are\nestimates from the queue's recurring timeslots (see the queue listing).\nAdhoc-scheduled posts are not counted, same as the listing.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_queue_summary","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueSummaryResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/briefing":{"get":{"tags":["businesses"],"summary":"Get account briefing","description":"List what needs doing on this workspace now, most urgent first, each with an action.\n\nCall this when the user has not given a concrete task (\"hi\", \"what should I\ndo?\"). Lead with item 1 and offer the items' `action.label`s as the choices;\ntapping one sends its `action.prompt`. Items, in fixed priority order:\nunanswered reviews rated 3 stars or less, a posting queue about to run dry,\nposts waiting for approval, a post format that clearly out-clicks another\n(both with 8+ posts), and a window of posts with zero link clicks. Every\ncount is computed from real data; restate it, never estimate it. `items` is\nempty when there is nothing to act on.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: This business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_account_briefing","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountBriefing"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/topics":{"get":{"tags":["topics"],"summary":"List topics","description":"List all topics for a business.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_topics","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results per page (1-100)","default":20,"title":"Limit"},"description":"Max results per page (1-100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_TopicResponse_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"post":{"tags":["topics"],"summary":"Create topic","description":"Create a new topic for a business.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"create_topic","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Location":{"description":"Absolute URL of the newly created resource.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"409":{"description":"Conflict — a resource like this already exists.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"patch":{"tags":["topics"],"summary":"Update topics","description":"Change many topics in one call: titles, on/off, and which category each is in.\n\nApply a whole topic table at once instead of one update_topic per row. Name\ncategories with `category_name`; list any that do not exist yet in\n`new_categories` and they are created first. Each change succeeds or fails\non its own; read `results`.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    422 validation_error: No changes, more than 100, or a change sends both category_id and category_name.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"update_topics","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTopicsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTopicsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/topics/{topic_id}":{"get":{"tags":["topics"],"summary":"Get topic","description":"Get a single topic.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this topic is not in your org.\n    404 resource_not_found: No topic with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_topic","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Topic Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"patch":{"tags":["topics"],"summary":"Update topic","description":"Update a topic.\n\nErrors:\n    400 invalid_request: No fields were given to update.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this topic is not in your org.\n    404 resource_not_found: No topic with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"update_topic","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Topic Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"delete":{"tags":["topics"],"summary":"Delete topic","description":"Soft-delete a topic.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this topic is not in your org.\n    404 resource_not_found: No topic with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"delete_topic","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Topic Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/categories":{"get":{"tags":["topics"],"summary":"List categories","description":"List all categories for a business. Categories group topics.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_categories","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results per page (1-100)","default":20,"title":"Limit"},"description":"Max results per page (1-100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_CategoryResponse_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"post":{"tags":["topics"],"summary":"Create category","description":"Create a new category for a business. Topics can be grouped under a category by setting the topic's `category_id`.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"create_category","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/categories/{category_id}":{"get":{"tags":["topics"],"summary":"Get category","description":"Get a single category.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this category is not in your org.\n    404 resource_not_found: No category with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_category","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"category_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Category Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"patch":{"tags":["topics"],"summary":"Update category","description":"Update a category.\n\nErrors:\n    400 invalid_request: No fields were given to update.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this category is not in your org.\n    404 resource_not_found: No category with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"update_category","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"category_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Category Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"delete":{"tags":["topics"],"summary":"Delete category","description":"Soft-delete a category.\n\nThe category's topics are NOT deleted. They keep their rows and become uncategorized, so nothing the user wrote is lost.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this category is not in your org.\n    404 resource_not_found: No category with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"delete_category","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"category_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Category Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/media/from-url":{"post":{"tags":["library"],"summary":"Upload media (from URL)","description":"Add an image or video to a business's MEDIA library by giving Marky a URL to fetch.\n\nPREFER THIS whenever the media has any http(s) URL (a generated-image output URL,\na web image, a CDN or file-host link). It is the simplest, most reliable path: Marky\ndownloads it server-side, so it works even when your runtime can't make outbound\nrequests. Only reach for `create_media_upload` (a local file AND your runtime has\noutbound network) or `upload_media_from_reference` (ChatGPT only, auto-filled) when\nyou do NOT have a URL. Pass the http(s) URL; we store a durable copy. Private and\ninternal addresses (and redirects to them) are rejected.\n\nSend an `Idempotency-Key` header to make a retry safe (a resend that fetches\nthe same bytes returns the original media asset instead of a duplicate).\n\nSupported formats: JPEG, PNG, WebP, GIF, MP4, MOV. Images are automatically\noptimized. Max size: 20 MB for images, 500 MB for video.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID, the URL is not fetchable (bad scheme, private address, HTTP error), or the content is not a supported image or video.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    413 FILE_TOO_LARGE: The fetched media is larger than the size limit.\n    422 IDEMPOTENCY_KEY_CONFLICT: The Idempotency-Key was reused with a different body.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"upload_media_from_url","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadFromUrlRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Location":{"description":"Absolute URL of the newly created resource.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"409":{"description":"Conflict — a resource like this already exists.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/media/from-reference":{"post":{"tags":["library"],"summary":"Upload media from a host file reference","description":"ChatGPT-only: attach a file ChatGPT holds, fetched server-side. DO NOT hand-call.\n\nChatGPT fills the `file` argument AUTOMATICALLY from the user's attachment or a\ngenerated image (its Apps SDK marks this argument as a file param) and passes a\nreference carrying a `download_url`. Marky downloads the bytes server-side and\nstores a durable copy — so it works even though ChatGPT's code sandbox blocks the\noutbound upload that `create_media_upload` needs. The returned `original_url` is the\nMarky-hosted link you feed to `create_post` / `attach_media_to_file`.\n\nDO NOT select this tool yourself. If you are NOT ChatGPT — or you don't already\nhave a real host-issued `download_url` for the file — use `upload_media_from_url`\ninstead (when you have a URL), or `create_media_upload` (a local file when your\nruntime can make outbound web requests). There is no local-file access here, only\na server-side fetch of the URL in `file.download_url`, so calling this without a\ngenuine download_url just fails — don't invent one.\n\nSend an `Idempotency-Key` header to make a retry safe (a resend that fetches\nthe same bytes returns the original media asset instead of a duplicate).\n\nSupported formats: JPEG, PNG, WebP, GIF, MP4, MOV. Images are automatically\noptimized. Max size: 20 MB for images, 500 MB for video.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID, the download_url is not fetchable (bad scheme, private address, HTTP error), or the content is not a supported image or video.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    413 FILE_TOO_LARGE: The fetched media is larger than the size limit.\n    422 IDEMPOTENCY_KEY_CONFLICT: The Idempotency-Key was reused with a different body.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"upload_media_from_reference","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadFromReferenceRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/library":{"get":{"tags":["library"],"summary":"List media assets","description":"List MEDIA ASSETS (uploaded images and videos) in a business's media library.\n\nThis is the binary media library, NOT text documents. To list markdown/text\ndocuments use `list_files` instead. Use cursor for pagination.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_library","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"enum":["image","video"],"type":"string"},{"type":"null"}],"description":"Filter by media type","title":"Type"},"description":"Filter by media type"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results (1-100)","default":20,"title":"Limit"},"description":"Max results (1-100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_MediaResponse_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/library/search":{"get":{"tags":["library"],"summary":"Search media library","description":"Search a business's MEDIA library by meaning, returning the best matches first.\n\nThis is a semantic (vector) search over each image's alt-text, so it finds\nrelevant images even when the query words don't appear literally. Use it to\npick media for a post; for a plain reverse-chronological list use `list_library`.\n\nBy default it returns the business's own, unused, full-size photos: it hides\nphotos posted recently, AI-generated images, and images under 600px on the\nlong side. If nothing passes those filters it returns the best matches\nwithout the recency and size filters, and each item's `last_used_at` shows\nit was posted before. `unused_count` says how many unused photos the whole\nlibrary holds.\n\nResults are a single ranked page (most relevant first), so `next` is always\nnull — raise `limit` to get more.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"search_media_library","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"What to look for, in plain words (e.g. 'sunset beach', 'team photo').","title":"Query"},"description":"What to look for, in plain words (e.g. 'sunset beach', 'team photo')."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max results (1-50)","default":20,"title":"Limit"},"description":"Max results (1-50)"},{"name":"include_recently_used","in":"query","required":false,"schema":{"type":"boolean","description":"Also return photos posted recently. Leave false unless the user asked to reuse a photo.","default":false,"title":"Include Recently Used"},"description":"Also return photos posted recently. Leave false unless the user asked to reuse a photo."},{"name":"include_generated","in":"query","required":false,"schema":{"type":"boolean","description":"Also return AI-generated images and rendered designs. Leave false when you want the business's own photos.","default":false,"title":"Include Generated"},"description":"Also return AI-generated images and rendered designs. Leave false when you want the business's own photos."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaSearchPage"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/library/files":{"post":{"tags":["library"],"summary":"Create document","description":"Create a markdown/text DOCUMENT in a business's library.\n\nThis is the create endpoint for the same documents that `list_files`,\n`get_file`, `update_file`, and `delete_file` operate on (the\n`create_library_file` name is kept for backwards compatibility). It does NOT\nupload an image or video — for binary media use `upload_media`.\n\nDocuments are stored as resources and can be used as context for post\ngeneration. Use this to push blog posts, notes, or any written content.\n\nSend an `Idempotency-Key` header to make a retry safe (a resend with the same\nkey returns the original file instead of creating a duplicate).\n\nErrors:\n    400 invalid_request: The file could not be created (e.g. bad path or content).\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    422 IDEMPOTENCY_KEY_CONFLICT: The Idempotency-Key was reused with a different body.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"create_library_file","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileCreateResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Location":{"description":"Absolute URL of the newly created resource.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"409":{"description":"Conflict — a resource like this already exists.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/media":{"post":{"tags":["library"],"summary":"Upload media","description":"Upload a binary image or video file into a business's MEDIA library.\n\nUse this for actual image/video bytes (multipart upload). To create a\nmarkdown/text document instead, use `create_library_file`. The returned\nmedia asset can be attached to a document via `attach_media_to_file` and\nused in post generation.\n\nSend an `Idempotency-Key` header to make a retry safe (a resend of the same\nfile returns the original media asset instead of uploading a duplicate).\n\nSupported formats: JPEG, PNG, WebP, GIF, MP4, MOV. Images are automatically\noptimized. Max size: 20 MB for images, 500 MB for video.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    413 FILE_TOO_LARGE: The uploaded file is larger than the size limit (20 MB image / 500 MB video).\n    422 IDEMPOTENCY_KEY_CONFLICT: The Idempotency-Key was reused with a different file.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"upload_media","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"alt_text","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional hint about the media: an address, a name, anything the picture can't show. Stored as `source_alt_text`; `alt_text` is written by looking at the image itself shortly after upload.","title":"Alt Text"},"description":"Optional hint about the media: an address, a name, anything the picture can't show. Stored as `source_alt_text`; `alt_text` is written by looking at the image itself shortly after upload."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_media"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Location":{"description":"Absolute URL of the newly created resource.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"409":{"description":"Conflict — a resource like this already exists.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/folders":{"post":{"tags":["library"],"summary":"Create folder","description":"Create a folder to organize DOCUMENTS in a business's library.\n\nSend an `Idempotency-Key` header to make a retry safe (a resend with the same\nkey returns the original folder instead of creating a duplicate).\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    422 IDEMPOTENCY_KEY_CONFLICT: The Idempotency-Key was reused with a different body.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"create_folder","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Location":{"description":"Absolute URL of the newly created resource.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"409":{"description":"Conflict — a resource like this already exists.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"get":{"tags":["library"],"summary":"List folders","description":"List folders that organize DOCUMENTS in a business's library, A-Z. Pass parent_id to list subfolders. Use cursor for pagination.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_folders","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"parent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by parent folder (null for root)","title":"Parent Id"},"description":"Filter by parent folder (null for root)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results per page (1-100)","default":20,"title":"Limit"},"description":"Max results per page (1-100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_FolderResponse_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/folders/{folder_id}":{"delete":{"tags":["library"],"summary":"Delete folder","description":"Delete a folder. Folder must be empty (no files or subfolders).\n\nErrors:\n    400 invalid_request: The folder still has files or subfolders in it.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No folder with that ID exists, or it is not in this business.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"delete_folder","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Folder Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"get":{"tags":["library"],"summary":"Get folder","description":"Get a single folder.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this folder is not in your org.\n    404 resource_not_found: No folder with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_folder","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Folder Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"patch":{"tags":["library"],"summary":"Update folder","description":"Update a folder's name.\n\nErrors:\n    400 invalid_request: No fields were given to update.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this folder is not in your org.\n    404 resource_not_found: No folder with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"update_folder","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Folder Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/files":{"get":{"tags":["library"],"summary":"List files","description":"List markdown/text DOCUMENTS in a business's library.\n\nThese are text documents (created via `create_library_file`), NOT uploaded\nimages/videos — for media assets use `list_library` instead.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_files","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by folder (null for root)","title":"Folder Id"},"description":"Filter by folder (null for root)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_FileResponse_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/files/{file_id}":{"get":{"tags":["library"],"summary":"Get file","description":"Get a markdown/text DOCUMENT with its content (body_text) and attached media.\n\nFor a binary media asset (image/video), use `get_library_file` instead.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No file with that ID exists, or it is not in this business.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_file","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"file_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"File Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"put":{"tags":["library"],"summary":"Update file (deprecated — use PATCH)","description":"Update a markdown/text DOCUMENT's name or content.\n\nErrors:\n    400 invalid_request: No fields were given to update.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No file with that ID exists, or it is not in this business.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"update_file_legacy","deprecated":true,"security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"file_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"File Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Deprecation":{"description":"RFC 8594: 'true' when this operation is deprecated — migrate off it.","schema":{"type":"string"}},"Link":{"description":"RFC 8594: link to the deprecation/migration docs (rel=\"deprecation\").","schema":{"type":"string"}}}}}},"patch":{"tags":["library"],"summary":"Update file","description":"Update a markdown/text DOCUMENT's name or content.\n\nErrors:\n    400 invalid_request: No fields were given to update.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No file with that ID exists, or it is not in this business.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"update_file","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"file_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"File Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"delete":{"tags":["library"],"summary":"Delete file","description":"Delete a markdown/text DOCUMENT from the library.\n\nFor a media asset (image/video), use `delete_library_file` instead.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this file is not in your org.\n    404 resource_not_found: No file with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"delete_file","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"file_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"File Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/files/{file_id}/media":{"post":{"tags":["library"],"summary":"Attach media to file","description":"Attach media (images/videos) to a file. Idempotent: duplicate attachments are ignored.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No file with that ID exists, or it is not in this business.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"attach_media_to_file","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"file_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"File Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachMediaRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/library/{media_id}":{"get":{"tags":["library"],"summary":"Get media asset","description":"Get a single MEDIA ASSET (uploaded image or video) by its media ID.\n\nFor a markdown/text document, use `get_file` instead.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this file is not in your org.\n    404 resource_not_found: No file with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_library_file","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"media_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Media Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"delete":{"tags":["library"],"summary":"Delete media asset","description":"Soft-delete a MEDIA ASSET (image/video) from the media library (sets enabled=false).\n\nFor a markdown/text document, use `delete_file` instead.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this file is not in your org.\n    404 resource_not_found: No file with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"delete_library_file","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"media_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Media Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/media/uploads":{"post":{"tags":["library"],"summary":"Create media upload URL","description":"Create a short-lived URL to upload a local file into a business's MEDIA library.\n\nUSE THIS when the file is on a device or sandbox disk and has no public URL\n(media already on the web goes through `upload_media_from_url` instead).\nPUT the raw bytes to the returned `upload_url` (see `instructions` for the exact\ncurl command); the PUT response is the created media asset, whose `original_url`\nfeeds `create_post` and the rest of the API. From a hosted Claude client, run the\ncurl in the code-execution sandbox — the user's chat attachment is on its disk.\n\nPREFER letting Marky FETCH the image over pushing it: if the image has any URL\n(a generated-image output URL, a web image, a host-provided download URL), skip\nthis tool and use `upload_media_from_url` or pass the URL to `create_post` in\n`media_urls` — Marky downloads it server-side, so it works even when your sandbox\nblocks outbound network. Only use this PUT flow when the image is local-only AND\nyour runtime can make outbound web requests. On ChatGPT, prefer\n`upload_media_from_reference` (ChatGPT fills the file automatically and Marky fetches\nit server-side, so the sandbox never makes the outbound upload). If the PUT fails\nwith a connection\nerror, your sandbox is blocking egress: don't retry — fall back to a URL Marky can\nfetch, or tell the user the image couldn't be attached (don't post `media_urls: null`).\n\nThe URL expires after 1 hour and is bound to this business. Re-PUTting the same\nbytes safely returns the original asset; different bytes on the same URL are\nrejected.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"create_media_upload","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadCreateResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}},"security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}]}},"/api/businesses/{business_id}/posting-schedule":{"get":{"tags":["posts"],"summary":"Get posting schedule","description":"Get a business's recurring posting schedule.\n\nReturns the weekly timeslots (e.g. `[\"MON 15:00\", \"FRI 09:30\"]`) that drive\nthe daily auto-publish queue. A post added to the queue (`queue_post`)\npublishes at the next upcoming slot. If the business has no schedule yet, a\ndefault daily schedule is created and returned.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_posting_schedule","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostingScheduleResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"put":{"tags":["posts"],"summary":"Update posting schedule","description":"Replace a business's recurring posting schedule, or pause it.\n\nSend the full set of weekly timeslots in `DAY HH:MM` 24-hour form, either on\nthe business's own clock with `timeslots_local` (e.g. 1 PM local is\n`{\"timeslots_local\": [\"MON 13:00\", \"WED 13:00\"]}`) or in UTC with\n`timeslots` (`{\"timeslots\": [\"MON 18:00\", \"WED 18:00\"]}`). Send exactly one.\nWhen the owner names a time, use `timeslots_local`: it is the hour they said.\nThis replaces the whole schedule (it is not a merge). The next publish time is\nrecomputed automatically from the new slots. Check `timeslots_local` in the\nresponse before telling the owner what was saved.\n\n**To stop posting without losing anything, send `paused: true`** alongside the\ncurrent timeslots. Nothing publishes while a schedule is paused; the slots and\nevery queued post are kept, and `paused: false` resumes from the next upcoming\nslot. Sending an empty `timeslots` is NOT a pause — it is a request to delete\nthe schedule, and it is refused.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    422 invalid_request: A timeslot is not in 'DAY HH:MM' 24-hour form, or both `timeslots` and `timeslots_local` were sent.\n    422 SCHEDULE_HAS_NO_TIMESLOTS: No timeslots were sent. Send `paused: true` to stop posting instead.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"update_posting_schedule","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostingScheduleUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostingScheduleResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/webhooks":{"post":{"tags":["webhooks"],"summary":"Register webhook","description":"Register a webhook URL to receive events.\n\nCurrently supported events:\n- `post.published` — fired when a post is published to any platform.\n  Payload includes the full post object with `business_id`.\n\nWebhooks are org-scoped. One registration covers all businesses in the org.\n\nSend an `Idempotency-Key` header to make a retry safe (a resend with the same\nkey returns the original webhook instead of registering a duplicate).\n\nErrors:\n    400 invalid_request: The URL is not HTTPS, or the org already has 5 webhooks.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or you are\n        signed in as a user who is not an owner or admin of the org.\n    422 IDEMPOTENCY_KEY_CONFLICT: The Idempotency-Key was reused with a different body.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"create_webhook","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"get":{"tags":["webhooks"],"summary":"List webhooks","description":"List the webhook registrations for your org, newest first. Use cursor for pagination.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or you are\n        signed in as a user who is not an owner or admin of the org.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_webhooks","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results per page (1-100)","default":20,"title":"Limit"},"description":"Max results per page (1-100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_WebhookResponse_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/webhooks/{webhook_id}":{"delete":{"tags":["webhooks"],"summary":"Delete webhook","description":"Delete a webhook registration.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or you are\n        signed in as a user who is not an owner or admin of the org.\n    404 resource_not_found: No webhook with that ID exists, or it is not in your org.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"delete_webhook","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Webhook Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/webhooks/{webhook_id}/deliveries":{"get":{"tags":["webhooks"],"summary":"List webhook deliveries","description":"List recent delivery attempts for a webhook, newest first. Use cursor for pagination.\n\nShows status code, response time, success/failure, and error details\nfor each delivery attempt. Useful for debugging webhook integrations.\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or you are\n        signed in as a user who is not an owner or admin of the org.\n    404 resource_not_found: No webhook with that ID exists, or it is not in your org.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_webhook_deliveries","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Webhook Id"},"description":"A UUID identifier."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max results per page (1-50)","default":20,"title":"Limit"},"description":"Max results per page (1-50)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_WebhookDeliveryResponse_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/keys":{"post":{"tags":["keys"],"summary":"Create key","description":"Create a new API key for the specified org.\n\nSend an `Idempotency-Key` header to make a retry safe: a resend with the same\nkey returns the ORIGINAL key (including its one-time secret) instead of\nminting a second key.\n\nErrors:\n    401 authentication_required: The login token is missing, invalid, or expired.\n    403 permission_denied: You are not an owner or admin of this org.\n    422 IDEMPOTENCY_KEY_CONFLICT: The Idempotency-Key was reused with a different body.","operationId":"create_key","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}},"get":{"tags":["keys"],"summary":"List keys","description":"List the API keys for the specified org, newest first. Use cursor for pagination.\n\nErrors:\n    401 authentication_required: The login token is missing, invalid, or expired.\n    403 permission_denied: You are not an owner or admin of this org.","operationId":"list_keys","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"org_id","in":"query","required":true,"schema":{"type":"string","description":"Organization ID to list keys for","title":"Org Id"},"description":"Organization ID to list keys for"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results per page (1-100)","default":20,"title":"Limit"},"description":"Max results per page (1-100)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_ApiKeyListItem_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/keys/{key_id}":{"delete":{"tags":["keys"],"summary":"Revoke key","description":"Revoke an API key.\n\nErrors:\n    401 authentication_required: The login token is missing, invalid, or expired.\n    403 permission_denied: You are not allowed to revoke this key.\n    404 resource_not_found: No key with that ID exists.","operationId":"revoke_key","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Key Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/feedback":{"post":{"tags":["businesses"],"summary":"Submit feedback","description":"Submit a bug report, feature request, or general feedback.\n\nWorks from agents, scripts, or any API consumer. Feedback is stored\nand routed to the support team.\n\nSend an `Idempotency-Key` header to make a retry safe (a resend with the same\nkey returns the original submission instead of filing a duplicate).\n\nErrors:\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access.\n    422 IDEMPOTENCY_KEY_CONFLICT: The Idempotency-Key was reused with a different body.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"submit_feedback","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/integrations/{integration_id}/posts":{"get":{"tags":["integrations"],"summary":"List posts on a platform","description":"List posts published to a connected platform account, with stats.\n\nLive-fetches the most recent posts on the connected account (Marky-posted\nor otherwise) plus each post's metrics. Works across Facebook, Instagram,\nLinkedIn, Twitter/X, TikTok, Pinterest, and YouTube. Pagination via the\nreturned `next_cursor` for platforms that support it.\n\nSome accounts cannot be listed at all — a LinkedIn personal profile, or a\nplatform whose reads we have turned off on cost grounds. Those return 200\nwith `posts: []` and a populated `unavailable_reason`, NOT an error. Read\nthat field before concluding the account has no posts.\n\n`unavailable_reason` is also set when the posts ARE returned but their stats\ncould not be: an Instagram account holding media from before it became a\nbusiness account gets its posts with every metric null. Null means UNKNOWN,\nnever zero — do not report it as no engagement.\n\nErrors:\n    400 invalid_value: The integration_id is not a valid UUID.\n    400 invalid_request: The date range or pagination cursor was rejected.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    401 SOCIAL_TOKEN_EXPIRED: The connected account's token expired and could not be refreshed — the response's reconnect_url points to where to reconnect.\n    403 permission_denied: Your plan does not include API access.\n    404 resource_not_found: No integration with that ID exists, or it is not in your org.\n    429 rate_limit_exceeded: You sent too many requests this minute.\n    502 UPSTREAM_PROVIDER_ERROR: The social platform returned an error while fetching posts.","operationId":"list_integration_posts","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"integration_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Integration Id"},"description":"A UUID identifier."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date (ISO 8601 or Unix timestamp). Platform-dependent.","title":"Since"},"description":"Start date (ISO 8601 or Unix timestamp). Platform-dependent."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date (ISO 8601 or Unix timestamp). Platform-dependent.","title":"Until"},"description":"End date (ISO 8601 or Unix timestamp). Platform-dependent."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max posts per page","default":25,"title":"Limit"},"description":"Max posts per page"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor. Pass the `next_cursor` from a previous response.","title":"Cursor"},"description":"Pagination cursor. Pass the `next_cursor` from a previous response."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPostStats"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/integrations/{integration_id}/stats":{"get":{"tags":["integrations"],"summary":"Get integration account stats","description":"Fetch account/page analytics for a single connected integration.\n\nReturns the normalized `AccountStats` model (followers, impressions,\nreach, profile_views, plus a timeseries `metrics` array) for the\nintegration's platform — Facebook, Instagram, LinkedIn, Twitter/X,\nTikTok, Pinterest, or YouTube. Use the `id` from\n`GET /businesses/{business_id}/integrations` as the integration_id.\n\nSome accounts have no account-level analytics to give — a LinkedIn personal\nprofile, or a platform whose reads we have turned off on cost grounds.\nThose return 200 with a populated `unavailable_reason` and null metrics,\nNOT an error. Null there means \"not available\", not zero.\n\nErrors:\n    400 invalid_value: The integration_id is not a valid UUID.\n    400 invalid_request: A date, period, or metric value was rejected.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    401 SOCIAL_TOKEN_EXPIRED: The connected account's token expired and could not be refreshed — the response's reconnect_url points to where to reconnect.\n    403 permission_denied: Your plan does not include API access.\n    404 resource_not_found: No integration with that ID exists, or it is not in your org.\n    429 rate_limit_exceeded: You sent too many requests this minute.\n    502 UPSTREAM_PROVIDER_ERROR: The social platform returned an error while fetching stats.","operationId":"get_integration_stats","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"integration_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Integration Id"},"description":"A UUID identifier."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date (YYYY-MM-DD). Defaults to 30 days ago.","title":"Since"},"description":"Start date (YYYY-MM-DD). Defaults to 30 days ago."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date (YYYY-MM-DD). Defaults to today.","title":"Until"},"description":"End date (YYYY-MM-DD). Defaults to today."},{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"Aggregation period: day, week, days_28, lifetime","default":"day","title":"Period"},"description":"Aggregation period: day, week, days_28, lifetime"},{"name":"metrics","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated metric names (platform-specific). Omit for defaults.","title":"Metrics"},"description":"Comma-separated metric names (platform-specific). Omit for defaults."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountStats"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/integrations/{integration_id}/posts/{external_post_id}/stats":{"get":{"tags":["integrations"],"summary":"Get external post stats","description":"Fetch stats for a single post on a connected platform.\n\n`external_post_id` is the provider's post ID (e.g. Instagram media ID,\nTweet ID, TikTok video ID) — NOT the Marky post ID. Get external IDs\nfrom `GET /businesses/{business_id}/integrations/{integration_id}/posts`\n(each entry's `publish_id`) or from\n`GET /businesses/{business_id}/posts/{post_id}/stats` (each platform entry's\n`external_post_id`).\n\nReturns the normalized `PostStats` model (likes, comment_count, reach,\nviews, etc.).\n\nErrors:\n    400 invalid_value: The integration_id is not a valid UUID.\n    400 invalid_request: A metric value or the external_post_id was rejected.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    401 SOCIAL_TOKEN_EXPIRED: The connected account's token expired and could not be refreshed — the response's reconnect_url points to where to reconnect.\n    403 permission_denied: Your plan does not include API access.\n    404 resource_not_found: No integration with that ID exists, or it is not in your org.\n    429 rate_limit_exceeded: You sent too many requests this minute.\n    502 UPSTREAM_PROVIDER_ERROR: The social platform returned an error while fetching stats.","operationId":"get_external_post_stats","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"integration_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Integration Id"},"description":"A UUID identifier."},{"name":"external_post_id","in":"path","required":true,"schema":{"type":"string","title":"External Post Id"}},{"name":"metrics","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated metric names. Omit for defaults.","title":"Metrics"},"description":"Comma-separated metric names. Omit for defaults."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostStats"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/reviews":{"get":{"tags":["businesses"],"summary":"List Google Business reviews","description":"List the Google Business reviews for a business.\n\nReads reviews from the business's connected Google Business (Google My\nBusiness) account: reviewer, star rating, text, timestamps, and the\nbusiness's public reply if it has one. Use this to surface or summarize\ncustomer feedback (e.g. pull recent 5-star reviews). Paginate with the\nreturned `next_cursor` until it is null. When present, `needs_reply` marks\nthe reviews still waiting on the owner (3 stars or less, no reply).\n\nREAD ONLY — this endpoint never writes or replies to reviews.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    401 SOCIAL_TOKEN_EXPIRED: The Google Business connection auth failed; reconnect the account.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 NO_CONNECTED_SOCIALS: No Google Business account is connected to this business.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.\n    502 UPSTREAM_PROVIDER_ERROR: Google returned an error while fetching reviews.","operationId":"list_google_reviews","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","title":"Business Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max reviews per page (1-50).","default":50,"title":"Limit"},"description":"Max reviews per page (1-50)."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor. Pass the `next_cursor` from a previous response.","title":"Cursor"},"description":"Pagination cursor. Pass the `next_cursor` from a previous response."},{"name":"order_by","in":"query","required":false,"schema":{"type":"string","pattern":"^(rating|rating desc|updateTime desc)$","description":"Sort order: 'updateTime desc' (default), 'rating', or 'rating desc'.","default":"updateTime desc","title":"Order By"},"description":"Sort order: 'updateTime desc' (default), 'rating', or 'rating desc'."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/src__routes__api_v1__reviews__BusinessReviewsResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/templates":{"get":{"tags":["library"],"summary":"List templates","description":"Browse the design templates this business can fill into posts.\n\nReturns lightweight summaries (id, name, page count, preview). To see the\nfields/slots you must fill, call `search_templates` or fetch one and look at\nits `pages`. Pass `next` back as `cursor` to page.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"list_templates","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result.","title":"Cursor"},"description":"The `next` value from the previous page's response, passed back verbatim. Leave it out for the first page. When `next` is null you have every result."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_TemplateSummary_"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/templates/search":{"post":{"tags":["library"],"summary":"Search templates","description":"Pick a template for this business, with the fields/slots you must fill.\n\nMirrors Max's `search_template`: returns one template (weighted toward\nleast-recently-used) plus every text field and image slot to fill it. When\n`has_image_slot=true` but no template has a fillable image slot, returns 200\nwith `error=\"no_image_slot_templates\"` (fall back to an image-only post).\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"search_templates","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateSearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateSearchResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/templates/{template_id}":{"get":{"tags":["library"],"summary":"Get a template","description":"Fetch one template by id, with every field/slot you must fill.\n\nDeterministic (unlike `search_templates`, which picks one for you): pass a\n`template_id` from `list_templates` and get its per-page text fields (with\nguidance, character limits, and an example) and image slots. Feed the result\nstraight into `create_design`.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, this business is not in your org, or the template is private to another business.\n    404 resource_not_found: No business or template with that ID exists.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_template","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateDetail"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/designs":{"post":{"tags":["posts"],"summary":"Create design from template","description":"Fill a template into an on-brand, rendered design.\n\nGive a `template_id` (from `search_templates`) plus the copy for each text\nfield, your brand colors, logo, and any images for FILLER slots. We render\nthe design server-side and return its image URLs. Renders synchronously —\nexpect a few seconds. Send an `Idempotency-Key` header to make retries safe.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    400 missing_field: Copy was not provided for one or more required text fields, or an image was not provided for a required FILLER slot.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, this business is not in your org, or the template is private to another business.\n    404 resource_not_found: No business or template with that ID exists.\n    422 invalid_request: Copy exceeded a text field's max_characters, or a FILLER image could not be read.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"create_design","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422.","title":"Idempotency-Key"},"description":"Optional. Send a unique value (e.g. a UUID) to make this create request safe to retry. A repeat with the same key returns the original response instead of creating a duplicate. Cached for 24h, scoped to your org. Reusing a key with a different body returns 422."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesignCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesignResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/designs/{design_id}":{"get":{"tags":["posts"],"summary":"Get a design","description":"Re-fetch a design you created, with its rendered image URLs + edit link.\n\nUse this to read back a design after `create_design` (or after editing it).\nTo post it, call `create_post` with this `design_id` — the media is taken from\nthe design automatically.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business or design with that ID exists in this business.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_design","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"design_id","in":"path","required":true,"schema":{"type":"string","title":"Design Id"}},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesignResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/posts/{post_id}/design/edit":{"post":{"tags":["posts"],"summary":"Edit a post's design","description":"Edit a post's design with a plain-language instruction, then re-render.\n\nExample instructions: \"make the headline tan\", \"center the logo\", \"shrink the\nbody text\". We turn the instruction into typed edits, apply + render + save\nthem, and sync the new image onto the post. Renders synchronously.\n\nErrors:\n    400 invalid_value: The business_id or post_id is not a valid UUID.\n    400 invalid_request: This post has no design to edit.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business or post with that ID exists in this business.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"revise_post_design","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Post Id"},"description":"A UUID identifier."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostDesignEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostDesignEditResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}},"/api/businesses/{business_id}/planning-snapshot":{"get":{"tags":["businesses"],"summary":"Get planning snapshot","description":"Read everything a batch plan needs in one call: schedule, queue, topics, recent posts and library matches.\n\nCall this once before planning several posts, instead of get_posting_schedule,\nget_queue_summary, list_topics, list_posts and search_media_library one by\none. Each block says the same as its own tool, trimmed for planning: topics\nare titles by category (no ids), and each recent post is one line with its\nday, status and caption start. Call the individual tool when you need full\nrecords or ids.\n\nErrors:\n    400 invalid_value: The business_id is not a valid UUID.\n    401 authentication_required: API key or token is missing, invalid, or revoked.\n    403 permission_denied: Your plan does not include API access, or this business is not in your org.\n    404 resource_not_found: No business with that ID exists.\n    422 invalid_request: More than 6 media_queries, or recent_days is outside 1-90.\n    429 rate_limit_exceeded: You sent too many requests this minute.","operationId":"get_planning_snapshot","security":[{"HTTPBearer":["uid"]}],"parameters":[{"name":"business_id","in":"path","required":true,"schema":{"type":"string","description":"A UUID identifier.","title":"Business Id"},"description":"A UUID identifier."},{"name":"recent_days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"How many days of recent posts to include (1-90).","default":30,"title":"Recent Days"},"description":"How many days of recent posts to include (1-90)."},{"name":"media_queries","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"},"maxItems":6},{"type":"null"}],"description":"Up to 6 library searches to run, in plain words (e.g. 'our service truck'). Each returns up to 5 photos; a photo is only listed under the first query that found it.","title":"Media Queries"},"description":"Up to 6 library searches to run, in plain words (e.g. 'our service truck'). Each returns up to 5 photos; a photo is only listed under the first query that found it."},{"name":"Marky-Version","in":"header","required":false,"schema":{"type":"string","enum":["2026-04-08","2026-07-17","2026-08-02","2026-08-04","2026-08-06"],"example":"2026-08-06"},"description":"Opt into a dated API version. Omit to stay on the floor (2026-04-08) forever — unpinned clients never break. Pin to a newer date (e.g. 2026-08-06) to receive the newest response shapes. Unknown values fall back to the floor. See https://docs.mymarky.ai for the versioning model."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanningSnapshotResponse"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"422":{"description":"Validation error — one or more fields failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"400":{"description":"Bad request — the input was malformed or otherwise invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"401":{"description":"Authentication failed — the API key is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"403":{"description":"Forbidden — the key is valid but may not access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"404":{"description":"Not found — no resource matches the id in the path.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}},"429":{"description":"Rate limited — retry after the window resets (see Retry-After).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110 delta-seconds).","schema":{"type":"string"}}}},"500":{"description":"Server error — something failed on our side; retry or quote X-Request-Id.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window (IETF/Zalando name; preferred).","schema":{"type":"string"}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"string"}},"RateLimit-Reset":{"description":"UNIX epoch (seconds) when the current window resets.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Back-compat alias of RateLimit-Limit.","schema":{"type":"string"}},"X-RateLimit-Remaining":{"description":"Back-compat alias of RateLimit-Remaining.","schema":{"type":"string"}},"X-RateLimit-Reset":{"description":"Back-compat alias of RateLimit-Reset.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for THIS request (req_…). Quote it to support.","schema":{"type":"string"}},"X-Flow-ID":{"description":"Correlation id for the whole logical flow; echoes the request's X-Flow-ID if sent.","schema":{"type":"string"}},"Marky-Version":{"description":"The dated API version this response was served as.","schema":{"type":"string"}}}}}}}},"components":{"schemas":{"AccountBriefing":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BriefingItem"},"type":"array","title":"Items"}},"type":"object","title":"AccountBriefing","description":"The briefing, most urgent item first. Empty when there is nothing to do."},"AccountCredits":{"properties":{"remaining":{"type":"integer","title":"Remaining","description":"Credits left, monthly plus bonus."},"resets_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resets At","description":"When the monthly credits next reset. Null when unknown; never guess a date."},"resets_at_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resets At Local","description":"The same moment in the workspace's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting the UTC value."},"overdue":{"type":"boolean","title":"Overdue","description":"True when the reset date has passed and no credits are left. This is a real problem for support, not something to explain away."}},"type":"object","required":["remaining","resets_at","overdue"],"title":"AccountCredits","description":"The organization's image-generation credits."},"AccountDetails":{"properties":{"username":{"type":"string","title":"Username"},"picture_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Picture Url"},"profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"additionalProperties":false,"type":"object","required":["username"],"title":"AccountDetails","description":"Account metadata for display after OAuth."},"AccountLimits":{"properties":{"workspaces_used":{"type":"integer","title":"Workspaces Used","description":"Workspaces the organization has now."},"workspace_limit":{"type":"integer","title":"Workspace Limit","description":"Workspaces the plan allows, including any extra ones bought."},"socials_per_workspace":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Socials Per Workspace","description":"Connected socials allowed per workspace. Null means no cap."},"teams":{"type":"boolean","title":"Teams","description":"Whether the plan allows inviting teammates."}},"type":"object","required":["workspaces_used","workspace_limit","socials_per_workspace","teams"],"title":"AccountLimits","description":"Plan limits for this organization."},"AccountLinks":{"properties":{"manage_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manage Plan","description":"Opens the manage-plan window (pause or cancel). Billing managers only."},"new_workspace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Workspace","description":"Opens workspace creation (append &url=<website> to start from a site), or the plans page when at the workspace limit."}},"type":"object","required":["manage_plan","new_workspace"],"title":"AccountLinks","description":"In-app paths for navigate_user. Null means do not send this viewer there."},"AccountPlan":{"properties":{"name":{"type":"string","title":"Name","description":"Plan name, e.g. solo, growth, pro, free."},"status":{"type":"string","title":"Status","description":"active, trialing, past_due, unpaid, paused, or free."},"renews_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Renews At","description":"Next renewal. Null when there is no renewal (cancelling, lifetime, free)."},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End","description":"True when the plan is set to end instead of renewing."},"ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ends At","description":"When a cancelling plan ends. Null unless cancel_at_period_end."},"trial_ends_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trial Ends At","description":"Trial end, while trialing."},"paused_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paused Until","description":"While paused, the org is on the Free plan until this date."},"renews_at_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Renews At Local","description":"The same moment in the workspace's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting the UTC value."},"ends_at_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ends At Local","description":"The same moment in the workspace's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting the UTC value."},"trial_ends_at_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trial Ends At Local","description":"The same moment in the workspace's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting the UTC value."},"paused_until_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paused Until Local","description":"The same moment in the workspace's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting the UTC value."}},"type":"object","required":["name","status","renews_at","cancel_at_period_end","ends_at","trial_ends_at","paused_until"],"title":"AccountPlan","description":"The organization's plan. Only ever returned to a billing manager."},"AccountPublishStatus":{"properties":{"integration_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Integration Id"},"platform":{"type":"string","title":"Platform"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"status":{"additionalProperties":true,"type":"object","title":"Status"}},"type":"object","required":["integration_id","platform","username","status"],"title":"AccountPublishStatus","description":"One connected account's publish outcome for this post."},"AccountStats":{"properties":{"fetched_at":{"type":"string","format":"date-time","title":"Fetched At"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Id"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id"},"followers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Followers"},"following":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Following"},"posts_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Posts Count"},"impressions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Impressions"},"reach":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reach"},"profile_views":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Profile Views"},"website_clicks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Website Clicks"},"audience_age_pct":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Audience Age Pct","description":"Age bucket -> share of audience (0.0-1.0). IG, YT, LinkedIn, Pinterest."},"audience_gender_pct":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Audience Gender Pct","description":"Gender ('FEMALE'/'MALE'/'UNKNOWN') -> share. IG, YT, LinkedIn, Pinterest."},"audience_country_pct":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Audience Country Pct","description":"ISO country code -> share. IG, YT, LinkedIn."},"audience_city_pct":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Audience City Pct","description":"City name -> share. IG only."},"audience_industry_pct":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Audience Industry Pct","description":"LinkedIn-only: industry name -> share."},"audience_seniority_pct":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Audience Seniority Pct","description":"LinkedIn-only: seniority bucket -> share."},"audience_function_pct":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Audience Function Pct","description":"LinkedIn-only: job function -> share."},"metrics":{"items":{"$ref":"#/components/schemas/MetricTimeseries"},"type":"array","title":"Metrics","default":[]},"raw_metrics":{"additionalProperties":{"$ref":"#/components/schemas/MetricValue"},"type":"object","title":"Raw Metrics","default":{}},"unavailable_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unavailable Reason","description":"Non-null when the platform does not support account-level analytics for this account type (e.g. LinkedIn personal profiles). When set, the numeric fields being null means 'not supported by provider', not 'zero' or 'no data'."},"post_stats_hint":{"type":"string","title":"Post Stats Hint","default":"Account-level metrics vary by platform and are often sparse. For per-post impressions, reach, clicks and views, call GET /businesses/{business_id}/integrations/{integration_id}/posts (MCP: list_integration_posts) — it returns rich per-post stats even when these account-level fields are null."}},"type":"object","title":"AccountStats","description":"Account/page-level statistics.\n\nData-source agnostic: works for API fetches and local DB reads."},"AccountViewer":{"properties":{"role":{"type":"string","enum":["owner","admin","member"],"title":"Role","description":"owner or admin of the organization, otherwise member."},"manages_billing":{"type":"boolean","title":"Manages Billing","description":"True only for an owner/admin who is not an agency's white-label client."},"billing_contact":{"type":"string","enum":["you","your agency","your account owner"],"title":"Billing Contact","description":"Who handles billing for this viewer. Name this when the viewer cannot manage billing themselves."}},"type":"object","required":["role","manages_billing","billing_contact"],"title":"AccountViewer","description":"Who is asking, as far as billing goes."},"ActionResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"ActionResponse"},"AddTeamMemberRequest":{"properties":{"member_user_id":{"type":"string","title":"Member User Id","description":"User ID of the member to add"},"is_whitelabel":{"type":"boolean","title":"Is Whitelabel","description":"True for whitelabel client invites","default":false}},"type":"object","required":["member_user_id"],"title":"AddTeamMemberRequest"},"AdjustAbsoluteCreditsRequest":{"properties":{"org_id":{"type":"string","title":"Org Id","description":"Organization ID"},"bonus_absolute":{"type":"integer","title":"Bonus Absolute","description":"Target absolute value for bonus pool"},"monthly_absolute":{"type":"integer","title":"Monthly Absolute","description":"Target absolute value for monthly pool"}},"type":"object","required":["org_id","bonus_absolute","monthly_absolute"],"title":"AdjustAbsoluteCreditsRequest","description":"Request to adjust credits to absolute values for an organization.","examples":[{"bonus_absolute":500,"monthly_absolute":1000,"org_id":"org-123"}]},"AdjustAbsoluteCreditsResponse":{"properties":{"credits_monthly_remaining":{"type":"integer","title":"Credits Monthly Remaining","description":"Monthly pool balance after adjustment"},"credits_bonus_remaining":{"type":"integer","title":"Credits Bonus Remaining","description":"Bonus pool balance after adjustment"},"credits_total_remaining":{"type":"integer","title":"Credits Total Remaining","description":"Total credit balance after adjustment"}},"type":"object","required":["credits_monthly_remaining","credits_bonus_remaining","credits_total_remaining"],"title":"AdjustAbsoluteCreditsResponse","description":"Response after adjusting credits to absolute values.","examples":[{"credits_bonus_remaining":500,"credits_monthly_remaining":1000,"credits_total_remaining":1500}]},"AdjustCreditsRequest":{"properties":{"org_id":{"type":"string","title":"Org Id","description":"Organization ID"},"amount":{"type":"number","minimum":0.0,"title":"Amount","description":"Credit amount to adjust (positive = add, negative = debit)"},"reason":{"type":"string","enum":["purchase","post_gen","image_gen","video_gen","voiceover_gen","music_gen","monthly_reset","manual_adjustment","refund"],"title":"Reason","description":"Reason for credit adjustment"},"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"Optional business ID for context"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Optional metadata for the adjustment"},"requesting_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requesting User Id","description":"User ID making the request"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment","description":"Optional comment"}},"type":"object","required":["org_id","amount","reason"],"title":"AdjustCreditsRequest","description":"Request to adjust credits for an organization.","examples":[{"amount":100,"business_id":"biz-456","comment":"Customer service credit adjustment","org_id":"org-123","reason":"manual_adjustment","requesting_user_id":"user-789"}]},"AdjustCreditsResponse":{"properties":{"remaining":{"type":"integer","title":"Remaining","description":"Remaining credit balance after adjustment"}},"type":"object","required":["remaining"],"title":"AdjustCreditsResponse","description":"Response after adjusting credits.","examples":[{"remaining":600}]},"AdminUpdateSubscriptionRequest":{"properties":{"org_id":{"type":"string","title":"Org Id"},"plan":{"type":"string","title":"Plan"}},"type":"object","required":["org_id","plan"],"title":"AdminUpdateSubscriptionRequest"},"AggregatePostStatsRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business whose published posts are aggregated"},"group_by":{"type":"string","minLength":1,"title":"Group By","description":"Comma-separated dimensions (order matters). Allowed: platform, media_type, category, day_of_week, calendar_day, calendar_week, calendar_month.","default":"platform"},"metrics":{"anyOf":[{"items":{"type":"string","enum":["clicks","comments","engagement","likes","reach","saves","shares"]},"type":"array"},{"type":"null"}],"title":"Metrics","description":"Which numeric fields to aggregate. Omit for all of them, which is usually what you want."},"aggregations":{"type":"string","minLength":1,"title":"Aggregations","description":"Comma-separated sum, mean, median, min, max, post_count (post_count always included).","default":"sum,mean,post_count"},"sort_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort By","description":"Optional result column plus _desc or _asc (defaults to descending)."},"period_compare":{"type":"string","title":"Period Compare","description":"One of none, dod, wow, mom (prior-bucket comparison per entity).","default":"none"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform","description":"Optional single-platform filter."},"days_back":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Days Back","description":"Lookback window in days.","default":30},"limit_posts":{"type":"integer","maximum":2000.0,"minimum":1.0,"title":"Limit Posts","description":"Max posts loaded (capped at 2000).","default":2000},"timezone":{"type":"string","title":"Timezone","description":"IANA timezone for calendar_* and day_of_week buckets.","default":"UTC"}},"type":"object","required":["business_id"],"title":"AggregatePostStatsRequest","description":"Request body for the aggregate-post-stats pivot (mirrors Max's tool args)."},"AggregatePostStatsResponse":{"properties":{"meta":{"additionalProperties":true,"type":"object","title":"Meta","description":"group_by, rows_loaded/returned, timezone, period_compare"},"rows":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Rows","description":"Aggregated metrics per group"}},"type":"object","required":["meta","rows"],"title":"AggregatePostStatsResponse","description":"Aggregated pivot result: meta about the run + one dict per group."},"AnalyticsExportRequest":{"properties":{"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"Business whose posts are exported. The web FE names it via the X-Business-Id header; agent callers pass it here. Either works."},"days_back":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Days Back","description":"Lookback window in days (default 90).","default":90},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform","description":"Optional single-platform filter, e.g. \"instagram\"."},"timezone":{"type":"string","title":"Timezone","description":"IANA timezone used for the *_local / day_of_week / hour columns.","default":"UTC"}},"additionalProperties":false,"type":"object","title":"AnalyticsExportRequest","description":"What the caller asks for."},"AnalyticsExportResponse":{"properties":{"files":{"items":{"$ref":"#/components/schemas/ExportedFile"},"type":"array","title":"Files"},"manifest":{"$ref":"#/components/schemas/ExportManifest"}},"type":"object","required":["files","manifest"],"title":"AnalyticsExportResponse","description":"The whole export: files to write, plus the manifest as structured data."},"AnalyticsInsight":{"properties":{"summary_bullets":{"items":{"type":"string"},"type":"array","title":"Summary Bullets","description":"2-4 bullet points summarizing key performance highlights"},"recommendation":{"type":"string","title":"Recommendation","description":"One actionable recommendation"}},"type":"object","required":["summary_bullets","recommendation"],"title":"AnalyticsInsight","description":"LLM-generated insight about analytics performance."},"AnalyticsInsightRequest":{"properties":{"current_totals":{"$ref":"#/components/schemas/MetricTotals","description":"Current period totals"},"previous_totals":{"anyOf":[{"$ref":"#/components/schemas/MetricTotals"},{"type":"null"}],"description":"Previous period totals for comparison"},"segment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment","description":"Business industry segment"},"post_types":{"items":{"$ref":"#/components/schemas/PostTypeBreakdown"},"type":"array","title":"Post Types","description":"Breakdown by content type"},"platforms":{"items":{"$ref":"#/components/schemas/PlatformBreakdown"},"type":"array","title":"Platforms","description":"Breakdown by platform (including connected-but-dormant ones)"},"categories":{"items":{"$ref":"#/components/schemas/CategoryBreakdown"},"type":"array","title":"Categories","description":"Breakdown by content category (user-defined taxonomy)"},"top_posts":{"items":{"$ref":"#/components/schemas/PostSample"},"type":"array","title":"Top Posts","description":"Up to 20 best-performing posts by engagement, with captions/categories"},"bottom_posts":{"items":{"$ref":"#/components/schemas/PostSample"},"type":"array","title":"Bottom Posts","description":"Up to 20 worst-performing posts (lowest engagement, must have published_at)"},"connected_platform_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Connected Platform Count","description":"Total number of connected social accounts (may exceed platforms with posts)"},"period_label":{"type":"string","title":"Period Label","description":"Human label for the period","default":"this period"},"onboarding_goals":{"anyOf":[{"$ref":"#/components/schemas/OnboardingGoals"},{"type":"null"}],"description":"User's stated goals from onboarding, used to frame insights in their language"}},"type":"object","required":["current_totals"],"title":"AnalyticsInsightRequest","description":"Request for AI analytics insights."},"ApiKeyCreateRequest":{"properties":{"name":{"type":"string","title":"Name","description":"A label for this API key (e.g. 'n8n production')"},"org_id":{"type":"string","title":"Org Id","description":"Organization ID to create the key for"}},"additionalProperties":false,"type":"object","required":["name","org_id"],"title":"ApiKeyCreateRequest"},"ApiKeyCreateResponse":{"properties":{"id":{"type":"string","title":"Id","description":"API key ID"},"key":{"type":"string","title":"Key","description":"Full API key (shown only once)"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix","description":"Key prefix for identification"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","key","name","key_prefix","created_at"],"title":"ApiKeyCreateResponse"},"ApiKeyListItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked At"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","name","key_prefix","last_used_at","revoked_at","created_at"],"title":"ApiKeyListItem"},"AppleAuthRequest":{"properties":{"identity_token":{"type":"string","title":"Identity Token","description":"Apple-issued identity token (JWT) from Sign In with Apple"},"given_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Given Name","description":"User's first name. Only available on the very first sign-in."},"family_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Family Name","description":"User's last name. Only available on the very first sign-in."},"attribution":{"anyOf":[{"$ref":"#/components/schemas/MarketingAttribution"},{"type":"null"}]}},"type":"object","required":["identity_token"],"title":"AppleAuthRequest"},"ApplyVoiceUpdatesRequest":{"properties":{"updates":{"items":{"$ref":"#/components/schemas/FieldUpdate-Input"},"type":"array","title":"Updates","description":"The voice analysis updates to apply to the business profile."},"optimize_updates":{"items":{"$ref":"#/components/schemas/OptimizePromptUpdate"},"type":"array","title":"Optimize Updates","description":"Per-platform optimize prompt updates to apply."}},"type":"object","required":["updates"],"title":"ApplyVoiceUpdatesRequest"},"ApplyVoiceUpdatesResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Result status, e.g. 'ok'."}},"type":"object","required":["status"],"title":"ApplyVoiceUpdatesResponse"},"AssetBundle":{"properties":{"video":{"items":{"$ref":"#/components/schemas/VideoAsset"},"type":"array","title":"Video"},"audio":{"anyOf":[{"items":{"$ref":"#/components/schemas/AudioAsset"},"type":"array"},{"type":"null"}],"title":"Audio"},"images":{"anyOf":[{"items":{"$ref":"#/components/schemas/ImageAsset"},"type":"array"},{"type":"null"}],"title":"Images"}},"type":"object","required":["video"],"title":"AssetBundle","description":"Collection of assets for the edit."},"AsyncTaskRecord":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"business_id":{"type":"string","title":"Business Id"},"task_type":{"type":"string","title":"Task Type"},"status":{"type":"string","title":"Status"},"external_task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Task Id"},"state":{"additionalProperties":true,"type":"object","title":"State"},"duration_dimensions":{"additionalProperties":true,"type":"object","title":"Duration Dimensions"},"progress":{"type":"integer","title":"Progress","default":0},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"timeout_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timeout At"},"estimated_ready_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Estimated Ready At"},"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration"},"retry_count":{"type":"integer","title":"Retry Count","default":0},"max_retries":{"type":"integer","title":"Max Retries","default":3}},"type":"object","required":["business_id","task_type","status"],"title":"AsyncTaskRecord"},"AttachImagesRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID"},"filepath":{"type":"string","minLength":1,"title":"Filepath","description":"Full file path (must start with '/', e.g. '/documents/report.md')"},"media_ids":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Media Ids","description":"List of media/image IDs to attach (from business_media table)"}},"type":"object","required":["business_id","filepath","media_ids"],"title":"AttachImagesRequest","description":"Request to attach images to a file by media IDs.","examples":[{"business_id":"biz-123","filepath":"/documents/report.md","media_ids":["img-123","img-456"]}]},"AttachImagesResponse":{"properties":{"attached_image_ids":{"items":{"type":"string"},"type":"array","title":"Attached Image Ids","description":"The media IDs now attached to the file"},"message":{"type":"string","title":"Message","description":"Human-readable summary of what was attached"}},"type":"object","required":["attached_image_ids","message"],"title":"AttachImagesResponse","description":"Response from attaching images to a file."},"AttachMediaRequest":{"properties":{"media_ids":{"items":{"type":"string"},"type":"array","title":"Media Ids","description":"List of media IDs to attach to this file"}},"additionalProperties":false,"type":"object","required":["media_ids"],"title":"AttachMediaRequest"},"AttachedImage":{"properties":{"media_id":{"type":"string","title":"Media Id","description":"The image's media id. Pass this in `media_ids` to put the image on a post. Never use the UUID inside `url`: that is a file name."},"url":{"type":"string","title":"Url","description":"Public URL of the image"},"alt":{"type":"string","title":"Alt","description":"Alt text for the image (empty string if none)"}},"type":"object","required":["media_id","url","alt"],"title":"AttachedImage","description":"An image attached to a file.\n\n`media_id` is here because `update_post` and `create_post` take images only\nby `media_ids`. Without it, Max could find an image in an album but had no\nid to attach it with, so it guessed the UUID in the file name, which is a\nstorage key, not a media id (Career Counselling Australia, 2026-10-13: 51\nalbum images matched to posts by slug, none attachable)."},"AudioAsset":{"properties":{"id":{"type":"string","title":"Id"},"uri":{"type":"string","title":"Uri"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/AudioAssetMetadata"},{"type":"null"}]}},"type":"object","required":["id","uri"],"title":"AudioAsset","description":"Audio asset definition."},"AudioAssetMetadata":{"properties":{"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"}},"type":"object","title":"AudioAssetMetadata","description":"Metadata for audio assets."},"AudioClip":{"properties":{"id":{"type":"string","title":"Id"},"asset_id":{"type":"string","title":"Asset Id"},"source_start":{"type":"number","title":"Source Start"},"source_end":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Source End"},"timeline_start":{"type":"number","title":"Timeline Start"},"volume_db":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Volume Db","default":0.0},"volume_envelope":{"anyOf":[{"items":{"$ref":"#/components/schemas/VolumeKeyframe"},"type":"array"},{"type":"null"}],"title":"Volume Envelope"},"ducking":{"anyOf":[{"$ref":"#/components/schemas/DuckingSettings"},{"type":"null"}]}},"type":"object","required":["id","asset_id","source_start","timeline_start"],"title":"AudioClip","description":"Audio clip on timeline."},"AudioObject":{"properties":{"id":{"type":"string","title":"Id"},"src":{"type":"string","title":"Src"},"duration":{"type":"number","title":"Duration"},"startTime":{"type":"number","title":"Starttime"},"endTime":{"type":"number","title":"Endtime"},"volume":{"type":"number","title":"Volume"},"delay":{"type":"number","title":"Delay"}},"type":"object","required":["src","duration","startTime","endTime","volume","delay"],"title":"AudioObject"},"AudioTrack":{"properties":{"id":{"type":"string","title":"Id"},"clips":{"items":{"$ref":"#/components/schemas/AudioClip"},"type":"array","title":"Clips"}},"type":"object","required":["id","clips"],"title":"AudioTrack","description":"Audio track containing clips."},"AuthCredentials":{"properties":{"access_token":{"type":"string","title":"Access Token"},"access_token_expiration_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Access Token Expiration Time"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"refresh_token_expiration_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Refresh Token Expiration Time"}},"additionalProperties":false,"type":"object","required":["access_token"],"title":"AuthCredentials","description":"Credentials returned from token refresh."},"BackfillResult":{"properties":{"candidates":{"type":"integer","title":"Candidates"},"re_enqueued":{"type":"integer","title":"Re Enqueued"},"skipped_in_progress":{"type":"integer","title":"Skipped In Progress"},"skipped_no_batch":{"type":"integer","title":"Skipped No Batch","default":0}},"type":"object","required":["candidates","re_enqueued","skipped_in_progress"],"title":"BackfillResult","description":"Outcome of one backfill run."},"BatchFeedbackRequest":{"properties":{"rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Rating","description":"Star rating from 1 to 5"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment","description":"Optional user comment on the batch"},"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"Workspace the batch belongs to. When present with a comment, the comment is read as a possible lasting preference."}},"additionalProperties":false,"type":"object","required":["rating"],"title":"BatchFeedbackRequest"},"BatchFeedbackResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"memory_suggestion":{"anyOf":[{"$ref":"#/components/schemas/RatingMemorySuggestion"},{"type":"null"}],"description":"Present when this comment repeated something the owner said before, so it is now a card waiting for a yes or no."}},"additionalProperties":false,"type":"object","required":["success"],"title":"BatchFeedbackResponse"},"BatchIntegrationResult":{"properties":{"posts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Posts","description":"Posts with stats"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if fetch failed"},"error_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Type","description":"Error type classification"}},"type":"object","title":"BatchIntegrationResult","description":"Result for a single integration in a batch request."},"BatchPostStatsRequest":{"properties":{"integration_ids":{"items":{"type":"string"},"type":"array","title":"Integration Ids","description":"Integration IDs to fetch"},"limit":{"type":"integer","title":"Limit","description":"Max posts per integration","default":25},"since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since","description":"Start date (ISO format)"},"until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Until","description":"End date (ISO format)"}},"type":"object","required":["integration_ids"],"title":"BatchPostStatsRequest","description":"Request body for batch post stats."},"BatchPostStatsResponse":{"properties":{"results":{"additionalProperties":{"$ref":"#/components/schemas/BatchIntegrationResult"},"type":"object","title":"Results","description":"Results keyed by integration ID"}},"type":"object","required":["results"],"title":"BatchPostStatsResponse","description":"Response for batch post stats."},"BillingInfoResponse":{"properties":{"subscription":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionInfo"},{"type":"null"}]},"payment_method":{"anyOf":[{"$ref":"#/components/schemas/PaymentMethodInfo"},{"type":"null"}]},"recent_invoices":{"items":{"$ref":"#/components/schemas/InvoiceSummary"},"type":"array","title":"Recent Invoices","description":"Last 10 invoices"},"recent_charges":{"items":{"$ref":"#/components/schemas/ChargeInfo"},"type":"array","title":"Recent Charges","description":"Last 10 charges (payments)"},"upcoming_invoice_amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upcoming Invoice Amount"},"upcoming_invoice_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upcoming Invoice Date"},"account_balance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Balance","description":"Credit balance (negative = credit to customer)"},"billing_portal_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Portal Url","description":"Link for user to manage subscription"}},"type":"object","required":["subscription","payment_method","recent_invoices","recent_charges","upcoming_invoice_amount","upcoming_invoice_date","account_balance","billing_portal_url"],"title":"BillingInfoResponse","description":"Full billing summary for the user's organization."},"BlockedPlatform":{"properties":{"platform":{"type":"string","title":"Platform","description":"Platform identifier (facebook, instagram, etc.)"},"integration_id":{"type":"string","title":"Integration Id","description":"The account that won't receive the post."},"reason":{"type":"string","title":"Reason","description":"Stable reason code, e.g. INTEGRATION_DELETED (disconnected or needs a reconnect), PAGE_NOT_FOUND (no Page selected), MEDIA_FORMAT_ERROR (this platform needs a photo or video)."},"message":{"type":"string","title":"Message","description":"Plain-language explanation and fix."},"reconnect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reconnect Url","description":"Where the user reconnects this account, when reconnecting is the fix. Null otherwise."}},"type":"object","required":["platform","integration_id","reason","message"],"title":"BlockedPlatform","description":"One connected account that will NOT receive this post, and why."},"Body_apply_mask_endpoint_multimodal_apply_mask_post":{"properties":{"image_url":{"type":"string","title":"Image Url"},"mask_image":{"type":"string","format":"binary","title":"Mask Image"}},"type":"object","required":["image_url","mask_image"],"title":"Body_apply_mask_endpoint_multimodal_apply_mask_post"},"Body_upload_image_file":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"business_id":{"type":"string","title":"Business Id","description":"Business ID for organizing storage","default":""},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text","description":"Alt text for the image (optional)"},"resource_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Id","description":"Resource ID to link the image to (optional). Creates a resource_images junction record."}},"type":"object","title":"Body_upload_image_file"},"Body_upload_media":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"Image or video file"}},"type":"object","required":["file"],"title":"Body_upload_media"},"Body_upload_post_thumbnail_posts__post_id__thumbnail_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_post_thumbnail_posts__post_id__thumbnail_upload_post"},"BrandFirstArm":{"type":"string","enum":["control","test","not-in-experiment"]},"BrandFirstArmResponse":{"properties":{"arm":{"$ref":"#/components/schemas/BrandFirstArm"}},"type":"object","required":["arm"],"title":"BrandFirstArmResponse"},"BrandProfile":{"properties":{"name":{"type":"string","title":"Name","description":"Business name"},"industry":{"type":"string","title":"Industry","description":"Industry (1-2 words)"},"naics_code":{"type":"string","title":"Naics Code","description":"NAICS code for the industry"},"naics_title":{"type":"string","title":"Naics Title","description":"NAICS industry title"},"segment":{"type":"string","enum":["healthcare","marketing_agencies","financial_legal","local_services","education","retail_food","realestate","tech_software","creative_entertainment","churches_nonprofits","other"],"title":"Segment","description":"Business segment category"},"description":{"type":"string","title":"Description","description":"Comprehensive description: what makes the business unique, core values and principles (2-4 paragraphs)"},"audience_combined":{"type":"string","title":"Audience Combined","description":"Comprehensive audience description: ideal clientele, pain points, and goals the brand helps achieve (2-4 paragraphs)"},"tone":{"type":"string","title":"Tone","description":"Brand voice traits as dashed bullet list. 3-10 bullets, 3-10 words each. Describes HOW the brand communicates: personality, attitude, expertise level, emotional register."},"ctas":{"items":{"type":"string"},"type":"array","title":"Ctas","description":"3-5 short calls to action"},"testimonials":{"anyOf":[{"items":{"$ref":"#/components/schemas/Testimonial"},"type":"array"},{"type":"null"}],"title":"Testimonials","description":"Customer testimonials only if explicitly quoted in the content"},"events":{"anyOf":[{"items":{"$ref":"#/components/schemas/Event"},"type":"array"},{"type":"null"}],"title":"Events","description":"Events including weekly services, classes, and special gatherings"},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagline","description":"Social/twitter handle (e.g. @mybusiness14)"},"caption_writing_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Writing Rules","description":"Caption formatting rules only (not brand personality). Dashed bullet list, 3-7 rules about structure and formatting."},"content_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Language","description":"ISO 639-1 code of the language the website content is written in (e.g. 'en', 'he', 'es'). The language of the SOURCE text, not of your output."}},"type":"object","required":["name","industry","naics_code","naics_title","segment","description","audience_combined","tone","ctas"],"title":"BrandProfile","description":"LLM output schema for brand extraction (no topics)."},"BrandPropagation":{"properties":{"field":{"type":"string","enum":["caption_suffix","website","logo_url"],"title":"Field"},"old":{"type":"string","title":"Old"},"new":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New"},"affected_unpublished":{"type":"integer","title":"Affected Unpublished","description":"Unpublished posts that still carry the old value."},"requires":{"type":"string","enum":["caption_replace","rerender"],"title":"Requires"},"suggested":{"anyOf":[{"$ref":"#/components/schemas/SuggestedRule"},{"type":"null"}],"description":"The update_posts call that fixes them. Null for the logo, or when no safe rule exists."}},"type":"object","required":["field","old","new","affected_unpublished","requires"],"title":"BrandPropagation"},"BrandingResponse":{"properties":{"id":{"type":"string","title":"Id"},"domain":{"type":"string","title":"Domain"},"logo_url":{"type":"string","title":"Logo Url"},"primary_color":{"type":"string","title":"Primary Color"},"cname":{"anyOf":[{"$ref":"#/components/schemas/CName"},{"type":"null"}]},"name":{"type":"string","title":"Name"},"is_platform":{"type":"boolean","title":"Is Platform","description":"True if this is the Marky platform, false for whitelabel portals","default":false}},"type":"object","required":["id","domain","logo_url","primary_color","name"],"title":"BrandingResponse"},"BriefingAction":{"properties":{"label":{"type":"string","title":"Label","description":"Short button text, e.g. 'Make a carousel post'"},"prompt":{"type":"string","title":"Prompt","description":"The request the tap sends to Max, in the owner's voice"}},"type":"object","required":["label","prompt"],"title":"BriefingAction","description":"What tapping the item does."},"BriefingEvidence":{"properties":{"n":{"type":"integer","title":"N","description":"The count the headline is about"},"reviews":{"items":{"$ref":"#/components/schemas/ReviewPointer"},"type":"array","title":"Reviews","description":"review_needs_reply: the reviews, newest first"},"formats":{"items":{"$ref":"#/components/schemas/FormatClicks"},"type":"array","title":"Formats","description":"format_winner: [winner, loser]"},"window_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Window Days","description":"Stats items: how many days of posts were read"},"runs_dry_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Runs Dry At","description":"queue_running_low: estimated last queued publish"},"runs_dry_at_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runs Dry At Local","description":"runs_dry_at in the workspace's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting."}},"type":"object","required":["n"],"title":"BriefingEvidence","description":"The numbers behind an item. Only the fields for its kind are filled in."},"BriefingItem":{"properties":{"kind":{"type":"string","enum":["review_needs_reply","queue_running_low","pending_approvals","format_winner","zero_clicks"],"title":"Kind"},"headline":{"type":"string","title":"Headline","description":"One plain sentence stating the finding"},"evidence":{"$ref":"#/components/schemas/BriefingEvidence"},"action":{"$ref":"#/components/schemas/BriefingAction"}},"type":"object","required":["kind","headline","evidence","action"],"title":"BriefingItem","description":"One thing worth doing, with the evidence and the action."},"BusinessCreateRequest":{"properties":{"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone","description":"Brand voice — the tone and personality Marky writes captions in (the 'Profile' field in the app)."},"audience_combined":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience Combined","description":"The target audience the brand writes for — who the posts are meant to reach (the 'Target Audience' field in the app)."},"caption_writing_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Writing Rules","description":"Extra rules Marky follows when writing captions. Put each rule on its own line (newline-separated) — do NOT write one long paragraph. The app shows each line as a separate rule chip, so a run-on paragraph renders as one un-editable blob. E.g. 'Never use emojis\\nAlways end with a question\\nKeep captions under 80 words'."},"caption_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Suffix","description":"Text appended to the end of every generated caption (e.g. a hashtag block or a link)."},"custom_caption_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Caption Prompt","description":"A custom instruction injected into caption generation for this business."},"custom_meme_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Meme Prompt","description":"A custom instruction injected into meme generation for this business."},"custom_carousel_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Carousel Prompt","description":"A custom instruction injected into carousel generation for this business."},"design_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Style","description":"Free-text/markdown guidance on how this brand's graphics should be COMPOSED — which palette colour leads, how gradients are used, where the logo sits, whitespace, type treatment. Do NOT restate the raw brand tokens here (colours, fonts, logo file); those live in palettes / header_font / body_font / logo_url. This is the judgement the tokens can't express. SCOPE: it is added to the prompt for AI-GENERATED images and sets the look of theme covers. It does NOT reach a template design, so it will not change a batch generated from templates — for those, use palettes / header_font / body_font / logo_url, creative_types and include_stock. SIZE: 5000 characters, and writing this field REPLACES the whole value. Plan to the cap before composing; the response's `field_budgets` entry tells you how much room is left."},"brand_style_grid_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Style Grid Url","description":"URL of a rendered 2x2 grid of four sample posts, all in ONE of the treatments from the design_style table — the first look the user kept when they ran /brand-setup. Written by /brand-setup at the end of that run; the app shows it so someone can SEE their look instead of reading it."},"strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy","description":"Social strategy doc as MARKDOWN — the goal we're working toward, what we're trying right now, what we won't do, cadence and mix, plus a running log of experiments and what we learned. This is the layer an agency revisits each quarter. Write plain markdown (## headings, - bullets, | tables |); the app renders it in a rich-text editor, so no HTML tags — they show up as literal text and spend the size budget without adding meaning. Keep the pillars themselves in topics, the brand voice in tone/audience_combined, and how graphics look in design_style; strategy holds what none of those can express — what we're trying to ACHIEVE and what we've learned. SIZE: 6000 characters, and writing this field REPLACES the whole doc. A longer value is still saved, but it comes back with a warning you have to act on in the same turn — so plan the doc to the cap BEFORE you compose it, rather than writing long and compacting after. The response's `field_budgets` entry for this field tells you exactly how much room is left."},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagline","description":"Brand tagline shown on designs."},"ctas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ctas","description":"Call-to-action phrases Marky can use on designs (e.g. 'Call today', 'Book now')."},"palettes":{"anyOf":[{"items":{"$ref":"#/components/schemas/Palette"},"type":"array"},{"type":"null"}],"title":"Palettes","description":"Brand color palettes used on generated designs."},"header_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Font used for headlines on designs."},"body_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Font used for body text on designs."},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url","description":"URL of the brand logo."},"logo_background_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Background Color","description":"Background color behind the logo on designs (hex, or '#00000000' for transparent)."},"logo_width":{"anyOf":[{"type":"integer","format":"int32"},{"type":"null"}],"title":"Logo Width","description":"Logo width in pixels, used when laying the logo onto designs."},"name":{"type":"string","title":"Name","description":"Business name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Business description"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry","description":"Industry (e.g. 'Real Estate', 'Marketing Agency')"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website","description":"Business website URL"},"language":{"type":"string","title":"Language","description":"Content language, as an ISO 639-1 code (e.g. 'en') or English name (e.g. 'English'). Both accepted.","default":"English"}},"additionalProperties":false,"type":"object","required":["name"],"title":"BusinessCreateRequest"},"BusinessEmbeddingRequest":{"properties":{"payload":{"$ref":"#/components/schemas/BusinessWebhookPayload"}},"type":"object","required":["payload"],"title":"BusinessEmbeddingRequest"},"BusinessEvent":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name","description":"e.g. 'Hope Shop opening'."},"date":{"type":"string","format":"date","title":"Date","description":"The day it happens, YYYY-MM-DD, on the business's calendar."},"kind":{"type":"string","enum":["launch","opening","sale","event","other"],"title":"Kind","description":"What sort of moment it is.","default":"event"},"note":{"anyOf":[{"type":"string","maxLength":280},{"type":"null"}],"title":"Note","description":"Optional detail, e.g. '20% off'."}},"type":"object","required":["name","date"],"title":"BusinessEvent","description":"One dated moment of the business's own, stored in `businesses.events`."},"BusinessMediaRecord":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"business_id":{"type":"string","title":"Business Id"},"enabled":{"type":"boolean","title":"Enabled","default":true},"s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Key"},"supabase_storage_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supabase Storage Key"},"storage_bucket_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Bucket Id"},"thumb_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumb Key"},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text"},"source_alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Alt Text"},"alt_text_embedding":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Alt Text Embedding"},"original_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Url"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"type":{"anyOf":[{"type":"string","enum":["image","video","audio"]},{"type":"null"}],"title":"Type"},"staging_storage_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Staging Storage Key"},"expected_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Size"},"transcoding_status":{"anyOf":[{"type":"string","enum":["uploaded","processing","ready","failed"]},{"type":"null"}],"title":"Transcoding Status"},"transcoding_retry_count":{"type":"integer","title":"Transcoding Retry Count","default":0},"transcoding_failed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Transcoding Failed At"},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript"},"transcript_task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript Task Id"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"data_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Data Size"},"video_codec":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Codec"},"audio_codec":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Codec"},"video_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Video Bitrate"},"audio_bitrate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audio Bitrate"},"container_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Container Format"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"source_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"},"search_keyword":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Keyword"},"photographer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photographer"},"design_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Id"}},"type":"object","required":["business_id"],"title":"BusinessMediaRecord"},"BusinessRecord":{"properties":{"id":{"type":"string","title":"Id"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"audience_combined":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience Combined"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"business_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Text"}},"type":"object","required":["id"],"title":"BusinessRecord","description":"Business record for webhook payloads."},"BusinessResponse":{"properties":{"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone","description":"Brand voice — the tone and personality Marky writes captions in (the 'Profile' field in the app)."},"audience_combined":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience Combined","description":"The target audience the brand writes for — who the posts are meant to reach (the 'Target Audience' field in the app)."},"caption_writing_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Writing Rules","description":"Extra rules Marky follows when writing captions. Put each rule on its own line (newline-separated) — do NOT write one long paragraph. The app shows each line as a separate rule chip, so a run-on paragraph renders as one un-editable blob. E.g. 'Never use emojis\\nAlways end with a question\\nKeep captions under 80 words'."},"caption_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Suffix","description":"Text appended to the end of every generated caption (e.g. a hashtag block or a link)."},"custom_caption_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Caption Prompt","description":"A custom instruction injected into caption generation for this business."},"custom_meme_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Meme Prompt","description":"A custom instruction injected into meme generation for this business."},"custom_carousel_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Carousel Prompt","description":"A custom instruction injected into carousel generation for this business."},"design_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Style","description":"Free-text/markdown guidance on how this brand's graphics should be COMPOSED — which palette colour leads, how gradients are used, where the logo sits, whitespace, type treatment. Do NOT restate the raw brand tokens here (colours, fonts, logo file); those live in palettes / header_font / body_font / logo_url. This is the judgement the tokens can't express. SCOPE: it is added to the prompt for AI-GENERATED images and sets the look of theme covers. It does NOT reach a template design, so it will not change a batch generated from templates — for those, use palettes / header_font / body_font / logo_url, creative_types and include_stock. SIZE: 5000 characters, and writing this field REPLACES the whole value. Plan to the cap before composing; the response's `field_budgets` entry tells you how much room is left."},"brand_style_grid_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Style Grid Url","description":"URL of a rendered 2x2 grid of four sample posts, all in ONE of the treatments from the design_style table — the first look the user kept when they ran /brand-setup. Written by /brand-setup at the end of that run; the app shows it so someone can SEE their look instead of reading it."},"strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy","description":"Social strategy doc as MARKDOWN — the goal we're working toward, what we're trying right now, what we won't do, cadence and mix, plus a running log of experiments and what we learned. This is the layer an agency revisits each quarter. Write plain markdown (## headings, - bullets, | tables |); the app renders it in a rich-text editor, so no HTML tags — they show up as literal text and spend the size budget without adding meaning. Keep the pillars themselves in topics, the brand voice in tone/audience_combined, and how graphics look in design_style; strategy holds what none of those can express — what we're trying to ACHIEVE and what we've learned. SIZE: 6000 characters, and writing this field REPLACES the whole doc. A longer value is still saved, but it comes back with a warning you have to act on in the same turn — so plan the doc to the cap BEFORE you compose it, rather than writing long and compacting after. The response's `field_budgets` entry for this field tells you exactly how much room is left."},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagline","description":"Brand tagline shown on designs."},"ctas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ctas","description":"Call-to-action phrases Marky can use on designs (e.g. 'Call today', 'Book now')."},"palettes":{"anyOf":[{"items":{"$ref":"#/components/schemas/Palette"},"type":"array"},{"type":"null"}],"title":"Palettes","description":"Brand color palettes used on generated designs."},"header_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Font used for headlines on designs."},"body_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Font used for body text on designs."},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url","description":"URL of the brand logo."},"logo_background_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Background Color","description":"Background color behind the logo on designs (hex, or '#00000000' for transparent)."},"logo_width":{"anyOf":[{"type":"integer","format":"int32"},{"type":"null"}],"title":"Logo Width","description":"Logo width in pixels, used when laying the logo onto designs."},"id":{"type":"string","title":"Id","description":"Business ID"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Business name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Business description"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry","description":"Industry category"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website","description":"Business website URL"},"language":{"type":"string","title":"Language","description":"Content language as an ISO 639-1 code (e.g. 'en', 'fr', 'es').","default":"en"},"platform_writing_instructions":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Platform Writing Instructions","description":"The user's customized per-platform caption-writing instructions (empty when none set). Keys are canonical platform names (e.g. 'instagram', 'linkedIn') plus 'common' (applies to all platforms). Follow the matching entry when writing a caption or platform_overrides caption — the user's instructions ALWAYS outrank generic platform best practices. Update via PATCH (merge semantics). Returned by get_business only, not the list endpoint."},"events":{"items":{"$ref":"#/components/schemas/BusinessEvent"},"type":"array","title":"Events","description":"The business's own dated moments: launches, openings, sales, events (e.g. {'name': 'Hope Shop opening', 'date': '2026-10-10', 'kind': 'opening'}). They show up in list_upcoming_moments, and a caption that names one is dated to it. At most 20."},"include_stock":{"type":"boolean","title":"Include Stock","description":"Whether generated posts may use stock photos. True when never set, because stock is allowed by default. Set with update_business.","default":true},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"Default aspect ratio for generated designs ('1:1', '4:5' or '9:16'). Null when never set. Set with update_business."},"creative_types":{"additionalProperties":{"type":"integer"},"type":"object","title":"Creative Types","description":"Stored content-mix weights per creative format (keys: design, image-only, ai-image, gif, meme, video, carousel). Empty when never set, and generation then uses the default mix. Set with update_business."},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"The business's IANA timezone (e.g. 'Europe/Warsaw'). Posting-schedule slots and `*_local` times use it, and holidays in moments come from its country. Null when unset: times are then UTC and holidays default to the US. Set with update_business."},"created_at":{"type":"string","title":"Created At","description":"When the business was created"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update time"},"revision_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revision Id","description":"Id of the undo record this write created. Pass it to revert_revisions to put the record back exactly as it was before this call. Set only on the response to a write; null when you read the record."},"logo_source_size":{"anyOf":[{"$ref":"#/components/schemas/LogoSourceSize"},{"type":"null"}],"description":"Pixel size of the logo file you just set, before it was squared. Only on the response to a write that set logo_url; null everywhere else."},"warnings":{"items":{"$ref":"#/components/schemas/FieldWarning"},"type":"array","title":"Warnings","description":"Non-blocking notes about fields that need attention, empty when there is nothing to do. Act on them in the same turn you see them — that is while you still have the content in context.","readOnly":true},"field_budgets":{"items":{"$ref":"#/components/schemas/FieldBudget"},"type":"array","title":"Field Budgets","description":"Size ceilings for the fields that get pasted into the prompt for every generated post. READ THIS BEFORE COMPOSING a value for one of these fields — `remaining` is the room you have, and a budgeted field is REPLACED whole on write, so `limit` is the real target. Over-budget writes are accepted, not rejected, but they cost a full rewrite to fix.","readOnly":true}},"type":"object","required":["id","created_at","warnings","field_budgets"],"title":"BusinessResponse"},"BusinessSummaryResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Business ID"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Business name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Business description"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry","description":"Industry category"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website","description":"Business website URL"},"language":{"type":"string","title":"Language","description":"Content language as an ISO 639-1 code (e.g. 'en', 'fr', 'es').","default":"en"},"created_at":{"type":"string","title":"Created At","description":"When the business was created"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update time"}},"type":"object","required":["id","created_at"],"title":"BusinessSummaryResponse","description":"The slim per-row shape returned by list_businesses.\n\nDeliberately EXCLUDES the brand payload (tone, palettes, fonts, logo, ...) —\nthe list exists to find a business_id, and the full brand profile can be\nthousands of characters per row. Fetch one business via get_business for\nthe full BusinessResponse."},"BusinessUpdateRequest":{"properties":{"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone","description":"Brand voice — the tone and personality Marky writes captions in (the 'Profile' field in the app)."},"audience_combined":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience Combined","description":"The target audience the brand writes for — who the posts are meant to reach (the 'Target Audience' field in the app)."},"caption_writing_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Writing Rules","description":"Extra rules Marky follows when writing captions. Put each rule on its own line (newline-separated) — do NOT write one long paragraph. The app shows each line as a separate rule chip, so a run-on paragraph renders as one un-editable blob. E.g. 'Never use emojis\\nAlways end with a question\\nKeep captions under 80 words'."},"caption_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Suffix","description":"Text appended to the end of every generated caption (e.g. a hashtag block or a link)."},"custom_caption_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Caption Prompt","description":"A custom instruction injected into caption generation for this business."},"custom_meme_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Meme Prompt","description":"A custom instruction injected into meme generation for this business."},"custom_carousel_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Carousel Prompt","description":"A custom instruction injected into carousel generation for this business."},"design_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Style","description":"Free-text/markdown guidance on how this brand's graphics should be COMPOSED — which palette colour leads, how gradients are used, where the logo sits, whitespace, type treatment. Do NOT restate the raw brand tokens here (colours, fonts, logo file); those live in palettes / header_font / body_font / logo_url. This is the judgement the tokens can't express. SCOPE: it is added to the prompt for AI-GENERATED images and sets the look of theme covers. It does NOT reach a template design, so it will not change a batch generated from templates — for those, use palettes / header_font / body_font / logo_url, creative_types and include_stock. SIZE: 5000 characters, and writing this field REPLACES the whole value. Plan to the cap before composing; the response's `field_budgets` entry tells you how much room is left."},"brand_style_grid_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Style Grid Url","description":"URL of a rendered 2x2 grid of four sample posts, all in ONE of the treatments from the design_style table — the first look the user kept when they ran /brand-setup. Written by /brand-setup at the end of that run; the app shows it so someone can SEE their look instead of reading it."},"strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy","description":"Social strategy doc as MARKDOWN — the goal we're working toward, what we're trying right now, what we won't do, cadence and mix, plus a running log of experiments and what we learned. This is the layer an agency revisits each quarter. Write plain markdown (## headings, - bullets, | tables |); the app renders it in a rich-text editor, so no HTML tags — they show up as literal text and spend the size budget without adding meaning. Keep the pillars themselves in topics, the brand voice in tone/audience_combined, and how graphics look in design_style; strategy holds what none of those can express — what we're trying to ACHIEVE and what we've learned. SIZE: 6000 characters, and writing this field REPLACES the whole doc. A longer value is still saved, but it comes back with a warning you have to act on in the same turn — so plan the doc to the cap BEFORE you compose it, rather than writing long and compacting after. The response's `field_budgets` entry for this field tells you exactly how much room is left."},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagline","description":"Brand tagline shown on designs."},"ctas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ctas","description":"Call-to-action phrases Marky can use on designs (e.g. 'Call today', 'Book now')."},"palettes":{"anyOf":[{"items":{"$ref":"#/components/schemas/Palette"},"type":"array"},{"type":"null"}],"title":"Palettes","description":"Brand color palettes used on generated designs."},"header_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Font used for headlines on designs."},"body_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Font used for body text on designs."},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url","description":"URL of the brand logo."},"logo_background_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Background Color","description":"Background color behind the logo on designs (hex, or '#00000000' for transparent)."},"logo_width":{"anyOf":[{"type":"integer","format":"int32"},{"type":"null"}],"title":"Logo Width","description":"Logo width in pixels, used when laying the logo onto designs."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Business name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Business description"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry","description":"Industry"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website","description":"Business website URL"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Content language, as an ISO 639-1 code (e.g. 'en') or English name (e.g. 'English'). Both accepted."},"events":{"anyOf":[{"items":{"$ref":"#/components/schemas/BusinessEvent"},"type":"array","maxItems":20},{"type":"null"}],"title":"Events","description":"The business's own dated moments: launches, openings, sales, events (e.g. {'name': 'Hope Shop opening', 'date': '2026-10-10', 'kind': 'opening'}). They show up in list_upcoming_moments, and a caption that names one is dated to it. At most 20. REPLACES the whole list: send every event to keep (read them with get_business first), or [] to clear. Undo with revert_revisions."},"platform_writing_instructions":{"anyOf":[{"$ref":"#/components/schemas/PlatformWritingInstructions"},{"type":"null"}],"description":"MERGE-patch of the per-platform caption-writing instructions: only the keys you send change (e.g. {'facebook': 'Casual, ask a question.'} updates facebook and leaves every other platform alone). Send an EMPTY STRING to reset that platform to defaults."},"include_stock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Stock","description":"Whether generated posts may use stock photography."},"creative_types":{"anyOf":[{"$ref":"#/components/schemas/CreativeTypeWeights"},{"type":"null"}],"description":"MERGE-patch of the content mix: relative weights per creative format. Only the formats you send change, so you can adjust one without restating the others. Weights need not sum to 100."},"aspect_ratio":{"anyOf":[{"type":"string","enum":["1:1","4:5","9:16"]},{"type":"null"}],"title":"Aspect Ratio","description":"Default aspect ratio for generated designs."},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"The business's IANA timezone, e.g. 'Europe/Warsaw'. Posting-schedule slots and every `*_local` time use it, and holidays in moments come from its country. Existing schedule slots keep the moment they publish at; re-send the posting schedule to set slots on the new clock."},"failed_to_publish_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Failed To Publish Enabled","description":"Deprecated: has no effect. Email notifications are set per user, in the app under Account > Notifications, not per business.","deprecated":true},"low_scheduled_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Low Scheduled Enabled","description":"Deprecated: has no effect. Email notifications are set per user, in the app under Account > Notifications, not per business.","deprecated":true},"post_published_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Post Published Enabled","description":"Deprecated: has no effect. Email notifications are set per user, in the app under Account > Notifications, not per business.","deprecated":true},"post_stats_digest_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Post Stats Digest Enabled","description":"Deprecated: has no effect. Email notifications are set per user, in the app under Account > Notifications, not per business.","deprecated":true},"allow_duplicate_name":{"type":"boolean","title":"Allow Duplicate Name","description":"Set true to rename this business to a name another business in your org already has. Without it that rename is refused with 409 NAME_MATCHES_OTHER_WORKSPACE, because it usually means the content belongs in that other business instead.","default":false}},"additionalProperties":false,"type":"object","title":"BusinessUpdateRequest"},"BusinessUpdateResponse":{"properties":{"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone","description":"Brand voice — the tone and personality Marky writes captions in (the 'Profile' field in the app)."},"audience_combined":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience Combined","description":"The target audience the brand writes for — who the posts are meant to reach (the 'Target Audience' field in the app)."},"caption_writing_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Writing Rules","description":"Extra rules Marky follows when writing captions. Put each rule on its own line (newline-separated) — do NOT write one long paragraph. The app shows each line as a separate rule chip, so a run-on paragraph renders as one un-editable blob. E.g. 'Never use emojis\\nAlways end with a question\\nKeep captions under 80 words'."},"caption_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Suffix","description":"Text appended to the end of every generated caption (e.g. a hashtag block or a link)."},"custom_caption_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Caption Prompt","description":"A custom instruction injected into caption generation for this business."},"custom_meme_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Meme Prompt","description":"A custom instruction injected into meme generation for this business."},"custom_carousel_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Carousel Prompt","description":"A custom instruction injected into carousel generation for this business."},"design_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Style","description":"Free-text/markdown guidance on how this brand's graphics should be COMPOSED — which palette colour leads, how gradients are used, where the logo sits, whitespace, type treatment. Do NOT restate the raw brand tokens here (colours, fonts, logo file); those live in palettes / header_font / body_font / logo_url. This is the judgement the tokens can't express. SCOPE: it is added to the prompt for AI-GENERATED images and sets the look of theme covers. It does NOT reach a template design, so it will not change a batch generated from templates — for those, use palettes / header_font / body_font / logo_url, creative_types and include_stock. SIZE: 5000 characters, and writing this field REPLACES the whole value. Plan to the cap before composing; the response's `field_budgets` entry tells you how much room is left."},"brand_style_grid_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Style Grid Url","description":"URL of a rendered 2x2 grid of four sample posts, all in ONE of the treatments from the design_style table — the first look the user kept when they ran /brand-setup. Written by /brand-setup at the end of that run; the app shows it so someone can SEE their look instead of reading it."},"strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy","description":"Social strategy doc as MARKDOWN — the goal we're working toward, what we're trying right now, what we won't do, cadence and mix, plus a running log of experiments and what we learned. This is the layer an agency revisits each quarter. Write plain markdown (## headings, - bullets, | tables |); the app renders it in a rich-text editor, so no HTML tags — they show up as literal text and spend the size budget without adding meaning. Keep the pillars themselves in topics, the brand voice in tone/audience_combined, and how graphics look in design_style; strategy holds what none of those can express — what we're trying to ACHIEVE and what we've learned. SIZE: 6000 characters, and writing this field REPLACES the whole doc. A longer value is still saved, but it comes back with a warning you have to act on in the same turn — so plan the doc to the cap BEFORE you compose it, rather than writing long and compacting after. The response's `field_budgets` entry for this field tells you exactly how much room is left."},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagline","description":"Brand tagline shown on designs."},"ctas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ctas","description":"Call-to-action phrases Marky can use on designs (e.g. 'Call today', 'Book now')."},"palettes":{"anyOf":[{"items":{"$ref":"#/components/schemas/Palette"},"type":"array"},{"type":"null"}],"title":"Palettes","description":"Brand color palettes used on generated designs."},"header_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Font used for headlines on designs."},"body_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Font used for body text on designs."},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url","description":"URL of the brand logo."},"logo_background_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Background Color","description":"Background color behind the logo on designs (hex, or '#00000000' for transparent)."},"logo_width":{"anyOf":[{"type":"integer","format":"int32"},{"type":"null"}],"title":"Logo Width","description":"Logo width in pixels, used when laying the logo onto designs."},"id":{"type":"string","title":"Id","description":"Business ID"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Business name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Business description"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry","description":"Industry category"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website","description":"Business website URL"},"language":{"type":"string","title":"Language","description":"Content language as an ISO 639-1 code (e.g. 'en', 'fr', 'es').","default":"en"},"platform_writing_instructions":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Platform Writing Instructions","description":"The user's customized per-platform caption-writing instructions (empty when none set). Keys are canonical platform names (e.g. 'instagram', 'linkedIn') plus 'common' (applies to all platforms). Follow the matching entry when writing a caption or platform_overrides caption — the user's instructions ALWAYS outrank generic platform best practices. Update via PATCH (merge semantics). Returned by get_business only, not the list endpoint."},"events":{"items":{"$ref":"#/components/schemas/BusinessEvent"},"type":"array","title":"Events","description":"The business's own dated moments: launches, openings, sales, events (e.g. {'name': 'Hope Shop opening', 'date': '2026-10-10', 'kind': 'opening'}). They show up in list_upcoming_moments, and a caption that names one is dated to it. At most 20."},"include_stock":{"type":"boolean","title":"Include Stock","description":"Whether generated posts may use stock photos. True when never set, because stock is allowed by default. Set with update_business.","default":true},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"Default aspect ratio for generated designs ('1:1', '4:5' or '9:16'). Null when never set. Set with update_business."},"creative_types":{"additionalProperties":{"type":"integer"},"type":"object","title":"Creative Types","description":"Stored content-mix weights per creative format (keys: design, image-only, ai-image, gif, meme, video, carousel). Empty when never set, and generation then uses the default mix. Set with update_business."},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"The business's IANA timezone (e.g. 'Europe/Warsaw'). Posting-schedule slots and `*_local` times use it, and holidays in moments come from its country. Null when unset: times are then UTC and holidays default to the US. Set with update_business."},"created_at":{"type":"string","title":"Created At","description":"When the business was created"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update time"},"revision_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revision Id","description":"Id of the undo record this write created. Pass it to revert_revisions to put the record back exactly as it was before this call. Set only on the response to a write; null when you read the record."},"logo_source_size":{"anyOf":[{"$ref":"#/components/schemas/LogoSourceSize"},{"type":"null"}],"description":"Pixel size of the logo file you just set, before it was squared. Only on the response to a write that set logo_url; null everywhere else."},"propagation":{"items":{"$ref":"#/components/schemas/BrandPropagation"},"type":"array","title":"Propagation","description":"One entry per changed caption_suffix, website or logo_url that unpublished posts still carry. affected_unpublished says how many. For text, `suggested` is the exact update_posts call that fixes them: tell the user the count and offer it. Empty when nothing needs follow-up."},"warnings":{"items":{"$ref":"#/components/schemas/FieldWarning"},"type":"array","title":"Warnings","description":"Non-blocking notes about fields that need attention, empty when there is nothing to do. Act on them in the same turn you see them — that is while you still have the content in context.","readOnly":true},"field_budgets":{"items":{"$ref":"#/components/schemas/FieldBudget"},"type":"array","title":"Field Budgets","description":"Size ceilings for the fields that get pasted into the prompt for every generated post. READ THIS BEFORE COMPOSING a value for one of these fields — `remaining` is the room you have, and a budgeted field is REPLACED whole on write, so `limit` is the real target. Over-budget writes are accepted, not rejected, but they cost a full rewrite to fix.","readOnly":true}},"type":"object","required":["id","created_at","warnings","field_budgets"],"title":"BusinessUpdateResponse","description":"What update_business returns: the business, plus how far the change reaches."},"BusinessWebhookPayload":{"properties":{"type":{"type":"string","title":"Type"},"table":{"type":"string","title":"Table"},"schema_name":{"type":"string","title":"Schema Name"},"record":{"$ref":"#/components/schemas/BusinessRecord"},"old_record":{"anyOf":[{"$ref":"#/components/schemas/BusinessRecord"},{"type":"null"}]}},"type":"object","required":["type","table","schema_name","record"],"title":"BusinessWebhookPayload"},"CName":{"properties":{"cert_arn":{"type":"string","title":"Cert Arn"},"ssl_status":{"$ref":"#/components/schemas/DomainSslStatus","default":"REQUESTING_NEW_CERTIFICATE"},"dns_records":{"items":{"$ref":"#/components/schemas/DNSRecord"},"type":"array","title":"Dns Records"},"cloudfront_distribution_status":{"$ref":"#/components/schemas/CloudFrontDistributionStatus"},"cloudfront_distribution_id":{"type":"string","title":"Cloudfront Distribution Id"}},"type":"object","required":["cert_arn","dns_records","cloudfront_distribution_status","cloudfront_distribution_id"],"title":"CName"},"CancelSubscriptionRequest":{"properties":{"immediate":{"type":"boolean","title":"Immediate","default":false},"org_id":{"type":"string","title":"Org Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback"},"goal":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Goal","description":"What they hired us to do."},"delivered":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Delivered","description":"Whether they feel we delivered."}},"additionalProperties":false,"type":"object","required":["org_id"],"title":"CancelSubscriptionRequest"},"CanvaDesign":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title","default":""},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"Expires in ~15 minutes"},"created_at":{"type":"integer","title":"Created At","default":0},"updated_at":{"type":"integer","title":"Updated At","default":0},"page_count":{"type":"integer","title":"Page Count","default":1},"owner_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner User Id","description":"Canva user ID of the design owner (used to detect shared view-only designs)"}},"type":"object","required":["id"],"title":"CanvaDesign","description":"A Canva design summary returned from the list endpoint."},"CaptionEditClassification":{"properties":{"edit_summary":{"type":"string","title":"Edit Summary","description":"One sentence describing what the user changed."},"is_systematic":{"type":"boolean","title":"Is Systematic","description":"True if this edit pattern would apply to ALL future captions."},"update":{"anyOf":[{"$ref":"#/components/schemas/FieldUpdate-Output"},{"type":"null"}],"description":"The field update to suggest, or null for one-off edits."}},"type":"object","required":["edit_summary","is_systematic"],"title":"CaptionEditClassification"},"CaptionReplace":{"properties":{"find":{"type":"string","minLength":4,"title":"Find","description":"Exact text to find (at least 4 characters). Literal, not a pattern."},"replace":{"type":"string","title":"Replace","description":"Text to put in its place. May be empty."},"case_sensitive":{"type":"boolean","title":"Case Sensitive","description":"False (default) also matches ProtectCopiers.COM when find is protectcopiers.com.","default":false}},"additionalProperties":false,"type":"object","required":["find","replace"],"title":"CaptionReplace"},"CardOnFile":{"properties":{"id":{"type":"string","title":"Id"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand"},"last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last4"},"exp_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exp Month"},"exp_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exp Year"}},"type":"object","required":["id"],"title":"CardOnFile","description":"One saved card, in the shape the billing UI needs to render it."},"CardsOnFile":{"properties":{"default_card":{"anyOf":[{"$ref":"#/components/schemas/CardOnFile"},{"type":"null"}]},"backup_card":{"anyOf":[{"$ref":"#/components/schemas/CardOnFile"},{"type":"null"}]}},"type":"object","title":"CardsOnFile","description":"Which card gets charged first, and which one we fall back to."},"CategorizePostsRequest":{"properties":{"business_id":{"type":"string","title":"Business Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["business_id","status"],"title":"CategorizePostsRequest"},"CategorizeResult":{"properties":{"categorized_count":{"type":"integer","title":"Categorized Count"},"created_categories":{"items":{"type":"string"},"type":"array","title":"Created Categories"}},"type":"object","required":["categorized_count","created_categories"],"title":"CategorizeResult"},"CategorizeSinglePostRequest":{"properties":{"business_id":{"type":"string","title":"Business Id"},"post_id":{"type":"string","title":"Post Id"}},"type":"object","required":["business_id","post_id"],"title":"CategorizeSinglePostRequest"},"CategorizeSinglePostResult":{"properties":{"category_id":{"type":"string","title":"Category Id"},"category_name":{"type":"string","title":"Category Name"}},"type":"object","required":["category_id","category_name"],"title":"CategorizeSinglePostResult"},"CategorizeTopicsRequest":{"properties":{"business_id":{"type":"string","title":"Business Id"}},"type":"object","required":["business_id"],"title":"CategorizeTopicsRequest"},"CategoryBreakdown":{"properties":{"category":{"type":"string","title":"Category","description":"Category name as the user defined it (e.g. 'tips', 'client stories')"},"post_count":{"type":"integer","title":"Post Count","description":"Number of posts in this category"},"total_engagement":{"type":"integer","title":"Total Engagement","description":"Total engagement across posts in this category"},"avg_engagement":{"type":"number","title":"Avg Engagement","description":"Average engagement per post in this category"}},"type":"object","required":["category","post_count","total_engagement","avg_engagement"],"title":"CategoryBreakdown","description":"Post count and engagement by content category (the user's own category taxonomy)."},"CategoryCreateRequest":{"properties":{"name":{"type":"string","title":"Name","description":"Category name"},"description":{"type":"string","title":"Description","description":"Category description or notes","default":""},"color":{"type":"string","title":"Color","description":"Hex color to tag this category in the app (e.g. '#6366F1').","default":"#6366F1"}},"additionalProperties":false,"type":"object","required":["name"],"title":"CategoryCreateRequest"},"CategoryResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Category ID"},"business_id":{"type":"string","title":"Business Id","description":"Business this category belongs to"},"name":{"type":"string","title":"Name","description":"Category name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Category description or notes"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color","description":"Hex color used to tag this category in the app (e.g. '#6366F1')."},"created_at":{"type":"string","title":"Created At","description":"When the category was created"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update time"}},"type":"object","required":["id","business_id","name","created_at"],"title":"CategoryResponse"},"CategoryUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Category name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Category description or notes"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color","description":"Hex color to tag this category in the app."}},"additionalProperties":false,"type":"object","title":"CategoryUpdateRequest"},"CertificateHealthReport":{"properties":{"checked":{"type":"integer","title":"Checked","default":0},"healthy":{"type":"integer","title":"Healthy","default":0},"not_issued_domains":{"items":{"type":"string"},"type":"array","title":"Not Issued Domains","default":[]},"expiring_soon_domains":{"items":{"type":"string"},"type":"array","title":"Expiring Soon Domains","default":[]},"errored":{"type":"integer","title":"Errored","default":0}},"type":"object","title":"CertificateHealthReport","description":"Result of one `verify_issued_certificates` run."},"ChangeEmailRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"New email address"}},"type":"object","required":["email"],"title":"ChangeEmailRequest"},"ChangePasswordRequest":{"properties":{"password":{"type":"string","title":"Password","description":"New password"}},"type":"object","required":["password"],"title":"ChangePasswordRequest"},"ChannelUsageResponse":{"properties":{"allowance":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Allowance","description":"Included channels per workspace. None = unlimited plan (no overage mechanic)."},"current_extra_channels":{"type":"integer","title":"Current Extra Channels","description":"Total purchased/granted overage slots, pooled at the org level (all sources summed)."},"total_connected":{"type":"integer","title":"Total Connected"},"total_overage_in_use":{"type":"integer","title":"Total Overage In Use"},"pool_remaining":{"type":"integer","title":"Pool Remaining"},"workspaces":{"items":{"$ref":"#/components/schemas/WorkspaceChannelUsage"},"type":"array","title":"Workspaces"}},"type":"object","required":["allowance","current_extra_channels","total_connected","total_overage_in_use","pool_remaining","workspaces"],"title":"ChannelUsageResponse"},"ChargeInfo":{"properties":{"id":{"type":"string","title":"Id"},"amount":{"type":"string","title":"Amount"},"status":{"type":"string","title":"Status","description":"succeeded, pending, failed"},"created_at":{"type":"string","title":"Created At"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"refunded":{"type":"boolean","title":"Refunded"},"refund_amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refund Amount"},"failure_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Message"}},"type":"object","required":["id","amount","status","created_at","description","refunded","refund_amount","failure_message"],"title":"ChargeInfo","description":"A single charge (payment attempt)."},"ChatFeedbackRequest":{"properties":{"run_id":{"type":"string","title":"Run Id","description":"LangSmith run ID for the chat response"},"key":{"type":"string","title":"Key","description":"Feedback key","default":"chat-response"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score","description":"Feedback score (0 = bad, 1 = good)","default":0},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment","description":"Optional user comment"}},"type":"object","required":["run_id"],"title":"ChatFeedbackRequest"},"ChatFeedbackResponse":{"properties":{"success":{"type":"boolean","title":"Success"}},"type":"object","required":["success"],"title":"ChatFeedbackResponse"},"CheckVerificationRequest":{"properties":{"phone_number":{"type":"string","title":"Phone Number","description":"Phone number in E.164 format"},"code":{"type":"string","title":"Code","description":"6-digit verification code"}},"type":"object","required":["phone_number","code"],"title":"CheckVerificationRequest"},"CheckVerificationResponse":{"properties":{"verified":{"type":"boolean","title":"Verified"}},"type":"object","required":["verified"],"title":"CheckVerificationResponse"},"CheckoutRequest":{"properties":{"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"advanced_whitelabel_businesses":{"type":"integer","title":"Advanced Whitelabel Businesses","default":0},"reseller_whitelabel":{"type":"boolean","title":"Reseller Whitelabel","default":false},"extra_businesses":{"type":"integer","title":"Extra Businesses","default":0},"extra_channels":{"type":"integer","title":"Extra Channels","default":0},"promotion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promotion"},"org_id":{"type":"string","title":"Org Id"},"referring_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referring User Id"}},"additionalProperties":false,"type":"object","required":["org_id"],"title":"CheckoutRequest"},"CheckoutSessionResponse":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","title":"CheckoutSessionResponse"},"CleanupStagingRequest":{"properties":{"cutoff_hours":{"type":"integer","title":"Cutoff Hours","default":24}},"type":"object","title":"CleanupStagingRequest","description":"Request to cleanup orphaned staging files."},"CleanupStagingResponse":{"properties":{"status":{"type":"string","title":"Status"},"deleted_count":{"type":"integer","title":"Deleted Count"},"error_count":{"type":"integer","title":"Error Count"},"cutoff_hours":{"type":"integer","title":"Cutoff Hours"}},"type":"object","required":["status","deleted_count","error_count","cutoff_hours"],"title":"CleanupStagingResponse","description":"Response from staging cleanup operation."},"CleanupTasksRequest":{"properties":{"timeout_minutes":{"type":"integer","title":"Timeout Minutes","default":30}},"type":"object","title":"CleanupTasksRequest"},"CleanupTasksResponse":{"properties":{"status":{"type":"string","title":"Status"},"cleaned_up_count":{"type":"integer","title":"Cleaned Up Count"},"timeout_minutes":{"type":"integer","title":"Timeout Minutes"}},"type":"object","required":["status","cleaned_up_count","timeout_minutes"],"title":"CleanupTasksResponse"},"CloudFrontDistributionStatus":{"type":"string","enum":["InProgress","Deployed"],"title":"CloudFrontDistributionStatus"},"ColorType":{"type":"string","enum":["STATIC","BACKGROUND","AUTO","ACCENT","TEXT","ON_ACCENT","LOGO_BACKGROUND"],"title":"ColorType"},"Comment":{"properties":{"id":{"type":"string","title":"Id"},"platform":{"type":"string","title":"Platform"},"post_id":{"type":"string","title":"Post Id"},"post_caption":{"type":"string","title":"Post Caption"},"author":{"$ref":"#/components/schemas/CommentAuthor"},"text":{"type":"string","title":"Text"},"timestamp":{"type":"string","title":"Timestamp"},"can_reply":{"type":"boolean","title":"Can Reply","default":true},"is_read":{"type":"boolean","title":"Is Read","default":false},"is_archived":{"type":"boolean","title":"Is Archived","default":false},"reply":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply"},"replied_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replied At"},"source":{"$ref":"#/components/schemas/SourceAccount"}},"type":"object","required":["id","platform","post_id","post_caption","author","text","timestamp","source"],"title":"Comment"},"CommentAuthor":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"type":"string","title":"Avatar Url"}},"type":"object","required":["id","username","avatar_url"],"title":"CommentAuthor"},"CommentCreateRequest":{"properties":{"payload":{"$ref":"#/components/schemas/CommentWebhookPayload"}},"type":"object","required":["payload"],"title":"CommentCreateRequest"},"CommentRecord":{"properties":{"id":{"type":"string","title":"Id"},"post_id":{"type":"string","title":"Post Id"},"user_id":{"type":"string","title":"User Id"},"body":{"type":"string","title":"Body"},"resolved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Resolved"},"mentioned_user_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mentioned User Ids"}},"type":"object","required":["id","post_id","user_id","body"],"title":"CommentRecord"},"CommentWebhookPayload":{"properties":{"type":{"type":"string","title":"Type"},"table":{"type":"string","title":"Table"},"schema_name":{"type":"string","title":"Schema Name"},"record":{"$ref":"#/components/schemas/CommentRecord"},"old_record":{"anyOf":[{"$ref":"#/components/schemas/CommentRecord"},{"type":"null"}]}},"type":"object","required":["type","table","schema_name","record"],"title":"CommentWebhookPayload"},"CommentsResponse":{"properties":{"comments":{"items":{"$ref":"#/components/schemas/Comment"},"type":"array","title":"Comments"},"total":{"type":"integer","title":"Total"},"page":{"anyOf":[{"$ref":"#/components/schemas/PageIdentity"},{"type":"null"}]}},"type":"object","required":["comments","total"],"title":"CommentsResponse"},"CompleteProfileRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"Email address"},"password":{"type":"string","title":"Password","description":"Password"},"given_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Given Name"},"family_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Family Name"},"attribution":{"anyOf":[{"$ref":"#/components/schemas/MarketingAttribution"},{"type":"null"}]}},"type":"object","required":["email","password"],"title":"CompleteProfileRequest","description":"Convert an anonymous/invited user to a full account."},"ConnectIntegrationRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business to connect the integration to"},"type":{"type":"string","title":"Type","description":"Integration type (instagram, facebook, etc.)"},"username":{"type":"string","title":"Username","description":"Social account username"},"profile_user_id":{"type":"string","title":"Profile User Id","description":"Social account profile ID"},"auth_credentials":{"additionalProperties":true,"type":"object","title":"Auth Credentials","description":"OAuth credentials"},"profile_picture":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Picture","description":"Profile picture URL"},"publish_settings":{"additionalProperties":true,"type":"object","title":"Publish Settings","description":"Publish settings"},"selected_page":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Selected Page","description":"Selected page info"}},"type":"object","required":["business_id","type","username","profile_user_id","auth_credentials"],"title":"ConnectIntegrationRequest","description":"Request body for connecting a social integration."},"ConnectionStatusResponse":{"properties":{"connected":{"type":"boolean","title":"Connected","description":"Whether the business has an active Canva connection"},"canva_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canva User Id","description":"Canva user ID if connected"}},"type":"object","required":["connected"],"title":"ConnectionStatusResponse"},"CreateFileRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID"},"path":{"type":"string","title":"Path","description":"Full file path (must start with '/')"},"content":{"type":"string","title":"Content","description":"File content to write"},"file_type":{"type":"string","title":"File Type","description":"Type of file: 'markdown', 'html', or 'structured'"},"schema_type_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Schema Type Id","description":"Required if file_type is 'structured'"}},"type":"object","required":["business_id","path","content","file_type"],"title":"CreateFileRequest","description":"Request to create a new file.","examples":[{"business_id":"biz-123","content":"# Notes\n\nSome text","file_type":"markdown","path":"/documents/notes"}]},"CreateFileResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Created file ID"},"path":{"type":"string","title":"Path","description":"Full file path"}},"type":"object","required":["id","path"],"title":"CreateFileResponse","description":"Response from file creation."},"CreatePostsRequest":{"properties":{"posts":{"items":{"$ref":"#/components/schemas/PostCreateRequest"},"type":"array","maxItems":50,"minItems":1,"title":"Posts","description":"The posts to create, 1-50, each exactly like a create_post body. ONE item per post: a carousel is one item with several media_ids."},"idempotency_key":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Idempotency Key","description":"Makes a retry safe: send the same key with the same posts and you get the original results back instead of duplicates. Item i is stored under '<key>:<i>'. Same as the Idempotency-Key header; the header wins if both are sent."}},"additionalProperties":false,"type":"object","required":["posts"],"title":"CreatePostsRequest"},"CreatePostsResponse":{"properties":{"created":{"type":"integer","title":"Created","description":"How many items were saved."},"results":{"items":{"$ref":"#/components/schemas/ItemResult"},"type":"array","title":"Results","description":"One entry per item, in the order you sent them."}},"type":"object","required":["created","results"],"title":"CreatePostsResponse"},"CreateReelRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID"},"idea":{"type":"string","minLength":1,"title":"Idea","description":"What the Reel is about, in plain words, e.g. the user's own request."},"media_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":10},{"type":"null"}],"title":"Media Ids","description":"Library media ids to build the Reel from (photos or videos), copied exactly as search_media_library returned them. Leave empty to let us pick up to 6 of the business's own unused photos for the idea. Any id not in this workspace is refused with a 422 listing it."},"stock_query":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Stock Query","description":"Use stock video clips for this search instead of library photos. Only when the user asked for stock footage, or has too few photos."},"audio_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Audio Tags","description":"Music mood tags, e.g. ['upbeat', 'chill']."},"aspect_ratio":{"type":"string","enum":["9:16","1:1"],"title":"Aspect Ratio","description":"9:16 for Reels/TikTok/Shorts, 1:1 for the feed.","default":"9:16"}},"additionalProperties":false,"type":"object","required":["business_id","idea"],"title":"CreateReelRequest","description":"A Reel from the business's photos (default), picked photos, or stock."},"CreateReelResponse":{"properties":{"status":{"type":"string","title":"Status","description":"NEW: the Reel is saved in Review. RENDERING: still being made.","x-extensible-enum":["NEW","RENDERING"]},"task_id":{"type":"string","title":"Task Id","description":"The render task, for a caller that did not wait."},"post_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Id","description":"The new post, once made."},"media_urls":{"items":{"type":"string"},"type":"array","title":"Media Urls","description":"The Reel's video (.mp4) once made."},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"Cover frame."},"media_ids_used":{"items":{"type":"string"},"type":"array","title":"Media Ids Used","description":"The library media that actually appear in the Reel. It can be fewer than were picked: a template shows one photo per page."},"message":{"type":"string","title":"Message","description":"One plain sentence to relay to the user."}},"type":"object","required":["status","task_id","message"],"title":"CreateReelResponse","description":"The Reel, saved as a NEW post in Review (never published)."},"CreativePreferences":{"properties":{"creative_types":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Creative Types","description":"Distribution of creative types, e.g. {'design': 50, 'meme': 50}"},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"Default aspect ratio, e.g. '1:1' or '4:5'"}},"type":"object","title":"CreativePreferences","description":"User's creative type and aspect ratio preferences for post generation."},"CreativeTypeWeights":{"properties":{"design":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Design"},"image-only":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Image-Only","description":"Stock or library photo with no design treatment."},"ai-image":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Ai-Image","description":"AI-generated image."},"gif":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Gif"},"meme":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Meme"},"video":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Video"},"carousel":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Carousel"}},"additionalProperties":false,"type":"object","title":"CreativeTypeWeights","description":"Relative weighting of creative formats, as a FIXED-KEY object.\n\nSame reasoning as PlatformWritingInstructions: a free-form dict is not\nexpressible in strict JSON Schema, and this is the exact field where an agent\nonce passed a JSON-encoded *string* and white-screened the workspace.\n\nDeliberately NOT strict-mode (every field optional, not required). Under strict\nmode the model must restate all seven weights on every call, so \"add memes to\nmy mix\" would force it to re-derive the other six — and 45% of businesses with\na mix (3,585 of 7,926) have deliberately non-uniform weights that a wrong guess\nwould silently overwrite. Omitting a format leaves its stored weight alone.\n\nWeights are relative, not required to sum to 100 — the generator normalizes.\n\nThe keys are the FRONTEND's format names, which is what `preferences.creative_types`\nactually stores (7,903 businesses use `design`, 3,626 use `image-only`). The\ngeneration pipeline aliases `image-only` -> its internal `image` format at read\ntime (post_generation/format_selection.py). Writing the internal name here would\ncreate a key the media-mix picker can't see — a silent no-op write."},"CronResponse":{"properties":{"status":{"type":"string","title":"Status","default":"ok"},"processed":{"type":"integer","title":"Processed","default":0},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"}},"type":"object","title":"CronResponse"},"CropType":{"type":"string","enum":["fit","fill"],"title":"CropType","description":"Crop type for image processing."},"CsvImportRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID to create resources in"},"resource_type_id":{"type":"string","title":"Resource Type Id","description":"Resource type ID for all rows"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent folder ID. If None, import folder is at root"},"rows":{"items":{"additionalProperties":true,"type":"object"},"type":"array","maxItems":500,"minItems":1,"title":"Rows","description":"Parsed CSV rows as dicts (keys = schema property names)"}},"type":"object","required":["business_id","resource_type_id","rows"],"title":"CsvImportRequest","description":"Request to bulk-import resources from parsed CSV rows.","examples":[{"business_id":"uuid","resource_type_id":"uuid","rows":[{"price":"9.99","title":"Widget A"},{"price":"19.99","title":"Widget B"}]}]},"CsvImportResponse":{"properties":{"created_count":{"type":"integer","title":"Created Count","description":"Number of resources created"},"resource_ids":{"items":{"type":"string"},"type":"array","title":"Resource Ids","description":"IDs of created resources"},"folder_id":{"type":"string","title":"Folder Id","description":"ID of the folder containing imported resources"}},"type":"object","required":["created_count","resource_ids","folder_id"],"title":"CsvImportResponse","description":"Response with CSV import results.","examples":[{"created_count":2,"folder_id":"folder-uuid","resource_ids":["uuid-1","uuid-2"]}]},"DMAuthor":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"avatar_url":{"type":"string","title":"Avatar Url"}},"type":"object","required":["id","username","avatar_url"],"title":"DMAuthor"},"DMConversation":{"properties":{"id":{"type":"string","title":"Id"},"platform":{"type":"string","title":"Platform"},"participant":{"$ref":"#/components/schemas/DMAuthor"},"messages":{"items":{"$ref":"#/components/schemas/DMMessage"},"type":"array","title":"Messages"},"last_message_at":{"type":"string","title":"Last Message At"},"is_read":{"type":"boolean","title":"Is Read","default":false},"is_archived":{"type":"boolean","title":"Is Archived","default":false},"source":{"$ref":"#/components/schemas/SourceAccount"}},"type":"object","required":["id","platform","participant","messages","last_message_at","source"],"title":"DMConversation"},"DMConversationsResponse":{"properties":{"conversations":{"items":{"$ref":"#/components/schemas/DMConversation"},"type":"array","title":"Conversations"},"total":{"type":"integer","title":"Total"},"page":{"anyOf":[{"$ref":"#/components/schemas/PageIdentity"},{"type":"null"}]}},"type":"object","required":["conversations","total"],"title":"DMConversationsResponse"},"DMMessage":{"properties":{"id":{"type":"string","title":"Id"},"sender":{"type":"string","title":"Sender"},"text":{"type":"string","title":"Text"},"timestamp":{"type":"string","title":"Timestamp"}},"type":"object","required":["id","sender","text","timestamp"],"title":"DMMessage"},"DNSRecord":{"properties":{"Name":{"type":"string","title":"Name"},"Type":{"type":"string","title":"Type"},"Value":{"type":"string","title":"Value"}},"type":"object","required":["Name","Type","Value"],"title":"DNSRecord"},"DataResponse_FetchResponse_":{"properties":{"data":{"$ref":"#/components/schemas/FetchResponse"}},"type":"object","required":["data"],"title":"DataResponse[FetchResponse]"},"DataResponse_PostStatsResponse_":{"properties":{"data":{"$ref":"#/components/schemas/src__routes__integrations__socials__analytics__PostStatsResponse"}},"type":"object","required":["data"],"title":"DataResponse[PostStatsResponse]"},"DataResponse_PostsWithStatsResponse_":{"properties":{"data":{"$ref":"#/components/schemas/PostsWithStatsResponse"}},"type":"object","required":["data"],"title":"DataResponse[PostsWithStatsResponse]"},"DataResponse_SocialPostsResponse_":{"properties":{"data":{"$ref":"#/components/schemas/SocialPostsResponse"}},"type":"object","required":["data"],"title":"DataResponse[SocialPostsResponse]"},"DeleteMediaStorageRequest":{"properties":{"type":{"type":"string","title":"Type"},"table":{"type":"string","title":"Table"},"schema":{"type":"string","title":"Schema"},"record":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Record"},"old_record":{"$ref":"#/components/schemas/DeletedMediaRecord"}},"type":"object","required":["type","table","schema","record","old_record"],"title":"DeleteMediaStorageRequest","description":"Request to delete media storage files."},"DeletePostResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether deletion was successful"},"integration_id":{"type":"string","title":"Integration Id","description":"Integration ID"},"external_post_id":{"type":"string","title":"External Post Id","description":"External post ID from the platform"}},"additionalProperties":false,"type":"object","required":["success","integration_id","external_post_id"],"title":"DeletePostResponse","description":"Response for post deletion.","examples":[{"external_post_id":"post-456","integration_id":"int-123","success":true}]},"DeletePublishedPostBody":{"properties":{"platforms":{"items":{"type":"string"},"type":"array","title":"Platforms"},"delete_from_marky":{"type":"boolean","title":"Delete From Marky","default":false}},"type":"object","required":["platforms"],"title":"DeletePublishedPostBody"},"DeletePublishedPostResponse":{"properties":{"results":{"additionalProperties":true,"type":"object","title":"Results"}},"type":"object","required":["results"],"title":"DeletePublishedPostResponse"},"DeleteResponse":{"properties":{"deleted":{"type":"boolean","title":"Deleted","default":true}},"type":"object","title":"DeleteResponse"},"DeleteSkillRequest":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","description":"The skill name to delete (e.g. \"weekly-posts\" or \"/weekly-posts\")"}},"type":"object","required":["name"],"title":"DeleteSkillRequest","description":"Request to delete a business-owned skill (slash command)."},"DeleteSkillResponse":{"properties":{"deleted":{"type":"boolean","title":"Deleted","description":"True if a business-owned skill was deleted, False if no match was found"},"message":{"type":"string","title":"Message","description":"Confirmation message to relay to the user"}},"type":"object","required":["deleted","message"],"title":"DeleteSkillResponse","description":"Result of a delete_skill call."},"DeletedMediaRecord":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id"},"supabase_storage_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supabase Storage Key"},"s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Key"},"thumb_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumb Key"},"staging_storage_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Staging Storage Key"}},"type":"object","title":"DeletedMediaRecord","description":"The business_media row that was just deleted, as sent by the DB trigger.\n\nTyped rather than a bare dict so a storage-key column the trigger sends\ncannot be silently dropped at the door. Every field here must also appear in\nmarky.trigger_delete_media_storage()'s payload, or the object at that path is\nnever deleted -- that gap leaked 12,735 thumbnails before it was found."},"DeployHtmlRequest":{"properties":{"route":{"type":"string","title":"Route","description":"Route path (e.g., '/landing' or '/')"}},"type":"object","required":["route"],"title":"DeployHtmlRequest","description":"Request to deploy HTML resource.","examples":[{"route":"/landing"}]},"DeployHtmlResponse":{"properties":{"deployed_route":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployed Route","description":"Route path where resource is deployed"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain","description":"Deployment domain"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Full deployment URL"}},"type":"object","title":"DeployHtmlResponse","description":"Response from HTML deployment.","examples":[{"deployed_route":"/landing","domain":"deployments.mymarky.ai","url":"https://deployments.mymarky.ai/landing"}]},"DeploymentInfoResponse":{"properties":{"deployed_route":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployed Route","description":"Route path where resource is deployed"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain","description":"Deployment domain"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Full deployment URL"}},"type":"object","title":"DeploymentInfoResponse","description":"Response with deployment information.","examples":[{"deployed_route":"/landing","domain":"deployments.mymarky.ai","url":"https://deployments.mymarky.ai/landing"}]},"DesignCreateRequest":{"properties":{"template_id":{"type":"string","title":"Template Id","description":"Template to fill (from search_templates / list_templates)."},"text_content":{"additionalProperties":{"type":"string"},"type":"object","title":"Text Content","description":"Map of text-field id → copy. Provide every required (non-STATIC) field."},"palette":{"items":{"type":"string"},"type":"array","title":"Palette","description":"Brand colors as hex strings, e.g. ['#0A0A0A','#FFFFFF']."},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url","description":"Brand logo image URL."},"filler_media":{"additionalProperties":{"$ref":"#/components/schemas/FillerMediaInput"},"type":"object","title":"Filler Media","description":"Map of image-slot id → image to place in it."},"header_font":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Header Font","description":"Optional header font as {family, url}."},"body_font":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Body Font","description":"Optional body font as {family, url}."},"logo_background_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Background Color","description":"Solid color behind the logo, if any."},"ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ratio","description":"Resize the design to this aspect ratio, e.g. '4:5' or '1:1'."}},"additionalProperties":false,"type":"object","required":["template_id"],"title":"DesignCreateRequest","description":"Fill a template into a rendered, on-brand design."},"DesignEditRequest":{"properties":{"edits":{"items":{"$ref":"#/components/schemas/EditCommand"},"type":"array","title":"Edits","description":"Edits to apply"},"label_map":{"additionalProperties":{"type":"string"},"type":"object","title":"Label Map","description":"Label→ID mapping from the summary endpoint"}},"type":"object","required":["edits","label_map"],"title":"DesignEditRequest","description":"Request to apply structured edits to a design."},"DesignEditResponse":{"properties":{"design_id":{"type":"string","title":"Design Id"},"applied":{"type":"integer","title":"Applied","description":"Number of edits successfully applied"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","description":"Edit application errors"},"lint_issues":{"items":{"$ref":"#/components/schemas/LintIssue"},"type":"array","title":"Lint Issues","description":"Design quality issues"},"rendered_urls":{"items":{"type":"string"},"type":"array","title":"Rendered Urls","description":"Rendered image URLs after edit"}},"type":"object","required":["design_id","applied"],"title":"DesignEditResponse","description":"Result of applying edits to a design."},"DesignListResponse":{"properties":{"designs":{"items":{"$ref":"#/components/schemas/CanvaDesign"},"type":"array","title":"Designs","description":"List of user's Canva designs"},"continuation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Continuation","description":"Cursor for next page"}},"type":"object","required":["designs"],"title":"DesignListResponse"},"DesignPage":{"properties":{"id":{"type":"string","title":"Id"},"children":{"items":{"anyOf":[{"$ref":"#/components/schemas/ImageComponent"},{"$ref":"#/components/schemas/SvgComponent"},{"$ref":"#/components/schemas/TextComponent"},{"$ref":"#/components/schemas/LineComponent"},{"$ref":"#/components/schemas/FigureComponent"},{"$ref":"#/components/schemas/VideoComponent"},{"$ref":"#/components/schemas/GroupComponent"}]},"type":"array","title":"Children"},"width":{"type":"string","title":"Width","default":"auto"},"height":{"type":"string","title":"Height","default":"auto"},"background":{"type":"string","title":"Background","default":"white"},"bleed":{"type":"integer","title":"Bleed","default":0},"duration":{"type":"number","title":"Duration","default":5000.0},"custom":{"$ref":"#/components/schemas/PageMeta"}},"type":"object","required":["children"],"title":"DesignPage"},"DesignResponse":{"properties":{"design_id":{"type":"string","title":"Design Id","description":"Id of the saved design."},"template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Id","description":"Template the design was filled from (null if unknown)."},"business_id":{"type":"string","title":"Business Id","description":"Business the design belongs to."},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls","description":"Rendered page image URLs (one per page). To post this design, call create_post with this design_id — the media is taken from the design automatically."},"width":{"type":"integer","title":"Width","description":"Design width in px."},"height":{"type":"integer","title":"Height","description":"Design height in px."},"page_count":{"type":"integer","title":"Page Count","description":"Number of pages in the design."},"edit_url":{"type":"string","title":"Edit Url","description":"Open the design in the editor to view or tweak it — a link you can hand the user."}},"type":"object","required":["design_id","business_id","width","height","page_count","edit_url"],"title":"DesignResponse","description":"A freshly created, rendered design."},"DesignSummaryResponse":{"properties":{"text":{"type":"string","title":"Text","description":"Human-readable design layout summary"},"label_map":{"additionalProperties":{"type":"string"},"type":"object","title":"Label Map","description":"Maps component labels to UUIDs"}},"type":"object","required":["text","label_map"],"title":"DesignSummaryResponse","description":"Simplified view of a design for LLM consumption."},"DiscountInfo":{"properties":{"coupon_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coupon Name"},"percent_off":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Percent Off"},"amount_off_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Off Cents"},"duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration","description":"once, repeating, or forever"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},"type":"object","required":["coupon_name","percent_off","amount_off_cents","duration","end_date"],"title":"DiscountInfo","description":"Active coupon or discount."},"DiscountSubscriptionResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"coupon":{"type":"string","title":"Coupon"}},"type":"object","required":["coupon"],"title":"DiscountSubscriptionResponse"},"DomainReachabilityReport":{"properties":{"checked":{"type":"integer","title":"Checked","default":0},"serving":{"type":"integer","title":"Serving","default":0},"unreachable_domains":{"items":{"type":"string"},"type":"array","title":"Unreachable Domains","default":[]},"wrong_certificate_domains":{"items":{"type":"string"},"type":"array","title":"Wrong Certificate Domains","default":[]},"errored":{"type":"integer","title":"Errored","default":0}},"type":"object","title":"DomainReachabilityReport","description":"Result of one `verify_white_label_domains_reachable` run."},"DomainSslStatus":{"type":"string","enum":["EXPIRED","FAILED","INACTIVE","ISSUED","PENDING_VALIDATION","REVOKED","VALIDATION_TIMED_OUT","REQUESTING_NEW_CERTIFICATE","SDK_UNKNOWN"],"title":"DomainSslStatus"},"DowngradeSubscriptionResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"new_plan":{"type":"string","title":"New Plan"}},"type":"object","required":["new_plan"],"title":"DowngradeSubscriptionResponse"},"DuckingSettings":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"target_track_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target Track Ids"},"reduction_db":{"type":"number","title":"Reduction Db","default":0.0}},"type":"object","required":["enabled"],"title":"DuckingSettings","description":"Audio ducking settings."},"DuplicateResourcesRequest":{"properties":{"source_business_id":{"type":"string","title":"Source Business Id","description":"Source business ID to copy resources from"},"target_business_id":{"type":"string","title":"Target Business Id","description":"Target business ID to copy resources to"},"resource_ids":{"items":{"type":"string"},"type":"array","title":"Resource Ids","description":"List of resource IDs to duplicate"}},"type":"object","required":["source_business_id","target_business_id","resource_ids"],"title":"DuplicateResourcesRequest","description":"Request to duplicate resources to another business.","examples":[{"resource_ids":["res-uuid-1","res-uuid-2"],"source_business_id":"uuid","target_business_id":"uuid"}]},"DuplicateResourcesResponse":{"properties":{"duplicated_count":{"type":"integer","title":"Duplicated Count","description":"Total number of resources duplicated"},"new_resource_ids":{"items":{"type":"string"},"type":"array","title":"New Resource Ids","description":"List of new resource IDs created"}},"type":"object","required":["duplicated_count","new_resource_ids"],"title":"DuplicateResourcesResponse","description":"Response with duplication results.","examples":[{"duplicated_count":5,"new_resource_ids":["new-uuid-1","new-uuid-2"]}]},"EditCommand":{"properties":{"component_label":{"type":"string","title":"Component Label","description":"Component label from simplified view, e.g. 'header', 'body', 'image_filler', 'shape_rect'"},"page_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Index","description":"0-based slide the component is on (the 'Page N' in the view). REQUIRED for multi-slide designs so the edit targets the right slide's component, not a same-named one on another slide."},"field":{"anyOf":[{"type":"string","enum":["text","fill","fontSize","x","y","width","height","opacity","fontFamily","fontWeight","align","verticalAlign","backgroundColor","rotation","lineHeight","letterSpacing","textTransform","fontStyle","stroke","strokeWidth","cornerRadius","shadowEnabled","shadowBlur","shadowOffsetX","shadowOffsetY","shadowColor","shadowOpacity"]},{"type":"null"}],"title":"Field","description":"Which property to change. REQUIRED unless center_in is set."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}],"title":"Value","description":"The new value"},"center_in":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Center In","description":"Label of the container to center within. Use 'canvas' to center in the full canvas."},"center_axis":{"anyOf":[{"type":"string","enum":["both","horizontal","vertical"]},{"type":"null"}],"title":"Center Axis","description":"Which axis to centre on. Defaults to 'both'."}},"type":"object","required":["component_label"],"title":"EditCommand","description":"A single edit to apply to a design component.\n\nTwo modes:\n1. Field edit: set component_label + field + value\n2. Center: set component_label + center_in (label of container) + center_axis"},"EditFileRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID"},"operation":{"$ref":"#/components/schemas/EditOperation","description":"Find/replace operation (includes path). See edit_file documentation for operation formats."}},"type":"object","required":["business_id","operation"],"title":"EditFileRequest","description":"Request to edit a file's content.","examples":[{"business_id":"biz-123","operation":{"path":"/documents/notes.md","pattern":"Old Title","replacement":"New Title"}},{"business_id":"biz-123","operation":{"path":"/code.py","pattern":"BEFORE(.*?)AFTER","replacement":"$1"}}]},"EditFileResponse":{"properties":{"replacements":{"type":"integer","title":"Replacements","description":"Number of replacements made"}},"type":"object","required":["replacements"],"title":"EditFileResponse","description":"Response from file edit operation."},"EditOperation":{"properties":{"path":{"type":"string","title":"Path","description":"Full file path (must start with '/')"},"pattern":{"type":"string","title":"Pattern","description":"Regex pattern to find (supports capture groups)"},"replacement":{"type":"string","title":"Replacement","description":"Replacement string (use $1, $2, etc. for capture groups)"},"flags":{"items":{"type":"string","enum":["IGNORECASE","MULTILINE"]},"type":"array","title":"Flags","description":"Regex flags: IGNORECASE for case-insensitive, MULTILINE for ^/$ matching line boundaries"},"apply":{"type":"string","enum":["first","all"],"title":"Apply","description":"Apply to 'first' occurrence or 'all' occurrences","default":"first"},"dry_run":{"type":"boolean","title":"Dry Run","description":"If True, preview changes without applying them","default":false}},"type":"object","required":["path","pattern","replacement"],"title":"EditOperation","description":"Regex find/replace operation."},"EditPlanV1":{"properties":{"schema_version":{"type":"integer","const":1,"title":"Schema Version","default":1},"project":{"$ref":"#/components/schemas/ProjectSettings"},"assets":{"$ref":"#/components/schemas/AssetBundle"},"timeline":{"$ref":"#/components/schemas/Timeline"},"styles":{"anyOf":[{"$ref":"#/components/schemas/Styles"},{"type":"null"}]},"render":{"$ref":"#/components/schemas/RenderSettings"}},"additionalProperties":false,"type":"object","required":["project","assets","timeline","render"],"title":"EditPlanV1","description":"EditPlan v1 - declarative video editing DSL."},"EditPostDesignRequest":{"properties":{"post_id":{"type":"string","title":"Post Id","description":"The ID of the post whose design to edit"},"instruction":{"type":"string","minLength":1,"title":"Instruction","description":"What to change (e.g. 'make the background tan', 'center the header text', 'make the logo bigger')"}},"type":"object","required":["post_id","instruction"],"title":"EditPostDesignRequest","description":"Request to edit a post's visual design from a natural-language instruction."},"EditPostDesignResult":{"properties":{"post_id":{"type":"string","title":"Post Id","description":"The post that was edited"},"design_id":{"type":"string","title":"Design Id","description":"The design that was edited"},"rendered_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rendered Url","description":"URL of the final rendered design image"},"media_urls":{"items":{"type":"string"},"type":"array","title":"Media Urls","description":"Full media_urls written back to the post"},"summary":{"type":"string","title":"Summary","description":"Short natural-language summary of what changed"},"applied":{"type":"integer","title":"Applied","description":"Number of edits successfully applied"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","description":"Edits that could not be applied"},"changes":{"items":{"type":"string"},"type":"array","title":"Changes","description":"Evidence trail: one line per applied edit stating what actually changed"}},"type":"object","required":["post_id","design_id","summary","applied"],"title":"EditPostDesignResult","description":"Finished result of a server-side design edit (blocking)."},"EditVideoRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID for storage organization"},"edit_plan":{"$ref":"#/components/schemas/EditPlanV1","description":"EditPlan v1 specification"}},"type":"object","required":["business_id","edit_plan"],"title":"EditVideoRequest","description":"Request to edit video using EditPlan.","examples":[{"business_id":"biz-123","edit_plan":{"assets":{"video":[{"id":"main","uri":"https://example.com/video.mp4"}]},"project":{"aspect_ratio":"9:16","id":"project-1"},"render":{"output_format":"mp4"},"schema_version":1,"timeline":{"video_tracks":[{"clips":[{"asset_id":"main","id":"c1","source_end":10.0,"source_start":0.0,"timeline_start":0.0}],"id":"v1"}]}}}]},"Effect":{"properties":{"type":{"type":"string","enum":["color_preset","blur","vignette"],"title":"Type"},"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset"},"intensity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Intensity"}},"type":"object","required":["type"],"title":"Effect","description":"Visual effect to apply."},"EmailTemplate":{"type":"string","enum":["review-process-1","publishing-error","low-on-scheduled-posts","out-of-scheduled-posts","integration-removed","integration-invalid","invite-team-member","forgot-password","forgot-password-client","successful-referral","initial-setup-complete","welcome","nudge-connect-paid","churn-interview","reengagement-1-warm-nudge","reengagement-2-what-you-missed","reengagement-3-sunset","post-published","memorial-week-never-subbed","memorial-week-churned","upcoming-renewal","payment-recovery","payment-recovery-day3","payment-recovery-day5","payment-recovery-day7","payment-recovery-voucher","cancellation-confirmed","card-expiry-warning"],"title":"EmailTemplate","description":"Email template identifiers."},"ErrorCode":{"type":"string","title":"ErrorCode","description":"The full set of stable `error.code` values the API can return.\n\nTwo groups: (1) GENERIC codes the global handler derives from the HTTP status\nor message keyword for plain raises (see api_errors._error_code + the handlers),\nand (2) the typed BUSINESS codes (mirror of ErrorType) for raises the frontend\nmust tell apart from other same-status errors.\n\nThis enum exists so OpenAPI emits an `enum` for error.code — a canonical list in\nthe docs and a typed union for codegen — instead of a bare string. It does NOT\nvalidate runtime responses (those are plain dicts built in _build_error_response),\nso a code missing here only means incomplete docs, never a 500. The\ntest_error_code_enum_covers_* tests keep it in sync with ErrorType + _error_code\nso it can't silently drift.","x-extensible-enum":["authentication_required","permission_denied","resource_not_found","rate_limit_exceeded","validation_error","internal_error","invalid_value","invalid_id","already_exists","invalid_request","WORKSPACE_NOT_SUPPORTED","INSUFFICIENT_CREDITS","BUSINESS_CREDIT_LIMIT_EXCEEDED","NO_ENABLED_TOPICS","GENERATION_CAP_REACHED","CHECKOUT_BLOCKED","INVALID_API_KEY","SOCIAL_TOKEN_EXPIRED","FB_ACCOUNT_BLOCKED","PAYMENT_REQUIRED","NO_CONNECTED_SOCIALS","NOT_ENOUGH_POSTS_FOR_TOPICS","WORKSPACE_LIMIT_EXCEEDED","RECIPIENT_WORKSPACE_LIMIT_EXCEEDED","ADVANCED_WHITELABEL_QUOTA_FROZEN","RESELLER_WHITELABEL_AT_CAPACITY","RESELLER_WHITELABEL_NOT_PURCHASED","CHANNEL_LIMIT_EXCEEDED","PHONE_NOT_VERIFIED","FILE_TOO_LARGE","INVALID_FILE_TYPE","SUBSCRIPTION_ALREADY_ACTIVE","UPSTREAM_PROVIDER_ERROR","WEBSITE_UNREACHABLE","PLATFORM_MEDIA_UNSUPPORTED","SOCIAL_CONNECT_FAILED","SOCIAL_CONNECT_LINK_EXPIRED","SOCIAL_APP_PAUSED","NO_PHOTO_SOURCE","TEMPLATE_FORMAT_MISMATCH","TEMPLATE_NOT_FOUND","INVALID_CSV_ROW","IMAGE_GENERATION_FAILED","IMAGE_REFERENCE_INVALID","PDF_HAS_NO_TEXT","POST_RENDER_FAILED","POST_DESIGN_SELECTION_FAILED","POST_CONTENT_GENERATION_FAILED","POST_IDEATION_FAILED","POST_MEDIA_FAILED","POST_AI_MEDIA_FAILED","POST_AI_MEDIA_BLOCKED","POST_RENDER_UNAVAILABLE","IDEMPOTENCY_KEY_CONFLICT","NO_STRIPE_CUSTOMER","X_AGENCY_NOT_ENABLED","NO_ACTIVE_SUBSCRIPTION","POST_HAS_NO_VIDEO","POST_ALREADY_PUBLISHED","CAPTION_HAS_PLACEHOLDER","COPY_DATE_BEFORE_NEXT_SLOT","SCHEDULE_HAS_NO_TIMESLOTS","SIGNUP_BLOCKED","MEDIA_RECENTLY_USED","NAME_MATCHES_OTHER_WORKSPACE","REVIEW_NOT_FOUND","REVIEW_ALREADY_REPLIED","REVIEW_DETAILS_MISMATCH","PREVIEW_REQUIRED","PREVIEW_STALE","NOT_ENOUGH_LIBRARY_PHOTOS","UNKNOWN_MEDIA_ID","REEL_DAILY_LIMIT_REACHED","AUTOPILOT_DRAFT_ONLY","AUTOPILOT_CAP_REACHED","AUTOPILOT_NOT_AVAILABLE"]},"ErrorDetail":{"properties":{"type":{"type":"string","title":"Type","description":"Broad error category derived from the HTTP status (invalid_request_error, authentication_error, permission_error, not_found_error, rate_limit_error, api_error)."},"code":{"$ref":"#/components/schemas/ErrorCode","description":"Stable, machine-readable error code. Match on THIS, never on the message. Codes never change even when the message is reworded."},"message":{"type":"string","title":"Message","description":"Human-readable explanation. For display/logging only — do not parse."},"doc_url":{"type":"string","title":"Doc Url","description":"Link to the docs entry for this error code."},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param","description":"The offending request field, when the error is field-specific."},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"The id of this request (also returned as the X-Request-Id header). Quote it to support so they can find the exact request in our logs."},"reconnect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reconnect Url","description":"Present on social token-expired errors (SOCIAL_TOKEN_EXPIRED / REFRESH_TOKEN_EXPIRED): the page where the user reconnects the affected account, so an agent can surface the fix without a second call."},"is_reconnect_fixable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Reconnect Fixable","description":"True on social token-expired errors — the failure is fixed by reconnecting the account (paired with reconnect_url)."}},"type":"object","required":["type","code","message","doc_url"],"title":"ErrorDetail"},"ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/ErrorDetail","description":"Error details"}},"type":"object","required":["error"],"title":"ErrorResponse"},"Event":{"properties":{"date":{"type":"string","title":"Date"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"location":{"type":"string","title":"Location"},"cta":{"type":"string","title":"Cta"}},"type":"object","required":["date","title","description","location","cta"],"title":"Event"},"EventChannels":{"properties":{"email":{"type":"boolean","title":"Email","default":false},"push":{"type":"boolean","title":"Push","default":false}},"type":"object","title":"EventChannels","description":"Per-event channel toggles. Defaults are overridden at the field level\non NotificationPreferences for each event."},"ExportManifest":{"properties":{"business_id":{"type":"string","title":"Business Id"},"business_segment":{"type":"string","title":"Business Segment"},"timezone":{"type":"string","title":"Timezone"},"window_start":{"type":"string","title":"Window Start"},"window_end":{"type":"string","title":"Window End"},"row_count":{"type":"integer","title":"Row Count"},"truncated":{"type":"boolean","title":"Truncated","description":"True if the 3000-row cap bit."},"platforms":{"items":{"type":"string"},"type":"array","title":"Platforms"},"media_description_coverage_pct":{"type":"number","title":"Media Description Coverage Pct"},"generated_at":{"type":"string","title":"Generated At"}},"type":"object","required":["business_id","business_segment","timezone","window_start","window_end","row_count","truncated","platforms","media_description_coverage_pct","generated_at"],"title":"ExportManifest","description":"What is in the export. Deliberately contains no names, emails, or PII.\n\nA sandbox is a machine a model runs arbitrary code on. Anything here that\nidentifies a human is something worth stealing; an opaque uuid is not."},"ExportedFile":{"properties":{"path":{"type":"string","title":"Path","description":"Absolute path to write inside the sandbox."},"content_gzip_b64":{"type":"string","title":"Content Gzip B64"},"sha256":{"type":"string","title":"Sha256","description":"Of the DECOMPRESSED bytes."},"row_count":{"type":"integer","title":"Row Count","description":"Lines for posts.jsonl, 0 for the others."},"bytes_uncompressed":{"type":"integer","title":"Bytes Uncompressed"}},"type":"object","required":["path","content_gzip_b64","sha256","row_count","bytes_uncompressed"],"title":"ExportedFile","description":"One file to drop into the sandbox.\n\nBytes travel gzipped-then-base64 because captions plus alt text are ~70% of\nthe payload and compress ~8x; base64's 33% tax then applies to the small\ncompressed blob rather than the big raw one."},"ExtractFrameRequest":{"properties":{"video_url":{"type":"string","title":"Video Url","description":"URL or path to the video file"},"timestamp":{"type":"number","minimum":0.0,"title":"Timestamp","description":"Timestamp in seconds where to extract the frame"},"business_id":{"type":"string","title":"Business Id","description":"Business ID for organizing storage"}},"type":"object","required":["video_url","timestamp","business_id"],"title":"ExtractFrameRequest","description":"Request to extract a frame from a video.","examples":[{"business_id":"biz-123","timestamp":5.0,"video_url":"https://www3.cde.ca.gov/download/rod/big_buck_bunny.mp4"}]},"ExtractFrameResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Image record ID"},"url":{"type":"string","title":"Url","description":"Public full URL of the extracted frame"},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text","description":"Generated alt text for the frame"}},"type":"object","required":["id","url","alt_text"],"title":"ExtractFrameResponse","description":"Response from frame extraction.","examples":[{"alt_text":"A frame showing...","id":"img-123","url":"https://..."}]},"FacebookConnectOnboardingRequest":{"properties":{"code":{"type":"string","title":"Code","description":"Facebook OAuth authorization code"},"redirect_uri":{"type":"string","title":"Redirect Uri","description":"Redirect URI used in the OAuth flow"},"business_id":{"type":"string","title":"Business Id","description":"Business to attach the FB Page to"},"attribution":{"anyOf":[{"$ref":"#/components/schemas/MarketingAttribution"},{"type":"null"}]}},"type":"object","required":["code","redirect_uri","business_id"],"title":"FacebookConnectOnboardingRequest"},"FacebookInsightMetric":{"properties":{"name":{"type":"string","title":"Name"},"period":{"type":"string","title":"Period"},"values":{"items":{"$ref":"#/components/schemas/FacebookInsightValue"},"type":"array","title":"Values"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},"type":"object","required":["name","period","values"],"title":"FacebookInsightMetric","description":"Single metric entry in Facebook post insights response."},"FacebookInsightValue":{"properties":{"value":{"anyOf":[{"type":"integer"},{"type":"number"},{"additionalProperties":true,"type":"object"}],"title":"Value"}},"type":"object","required":["value"],"title":"FacebookInsightValue","description":"Single value entry in a Facebook insight metric."},"FacebookLoginRequest":{"properties":{"code":{"type":"string","title":"Code","description":"Facebook OAuth authorization code"},"redirect_uri":{"type":"string","title":"Redirect Uri","description":"Redirect URI used in the OAuth flow"},"attribution":{"anyOf":[{"$ref":"#/components/schemas/MarketingAttribution"},{"type":"null"}]}},"type":"object","required":["code","redirect_uri"],"title":"FacebookLoginRequest"},"FacebookPaging":{"properties":{"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"cursors":{"anyOf":[{"$ref":"#/components/schemas/FacebookPagingCursors"},{"type":"null"}]}},"type":"object","title":"FacebookPaging","description":"Facebook paging metadata."},"FacebookPagingCursors":{"properties":{"before":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Before"},"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After"}},"type":"object","title":"FacebookPagingCursors","description":"Facebook paging cursor data."},"FacebookPost":{"properties":{"id":{"type":"string","title":"Id"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"created_time":{"type":"string","title":"Created Time"},"full_picture":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Picture"},"permalink_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink Url"},"attachments":{"anyOf":[{"items":{"$ref":"#/components/schemas/FacebookPostAttachment"},"type":"array"},{"type":"null"}],"title":"Attachments"},"insights":{"anyOf":[{"$ref":"#/components/schemas/FacebookPostInsights"},{"type":"null"}]}},"type":"object","required":["id","created_time"],"title":"FacebookPost","description":"Facebook post payload."},"FacebookPostAttachment":{"properties":{"media":{"anyOf":[{"$ref":"#/components/schemas/FacebookPostAttachmentMedia"},{"type":"null"}]},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"type":"object","title":"FacebookPostAttachment","description":"Facebook attachment entry."},"FacebookPostAttachmentMedia":{"properties":{"image":{"anyOf":[{"$ref":"#/components/schemas/FacebookPostAttachmentMediaImage"},{"type":"null"}]}},"type":"object","title":"FacebookPostAttachmentMedia","description":"Facebook attachment media wrapper."},"FacebookPostAttachmentMediaImage":{"properties":{"src":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Src"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"}},"type":"object","title":"FacebookPostAttachmentMediaImage","description":"Facebook attachment media image payload."},"FacebookPostInsights":{"properties":{"data":{"items":{"$ref":"#/components/schemas/FacebookInsightMetric"},"type":"array","title":"Data"},"paging":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Paging"}},"type":"object","required":["data"],"title":"FacebookPostInsights","description":"Response model for Facebook post insights."},"FacebookPostsResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/FacebookPost"},"type":"array","title":"Data"},"paging":{"anyOf":[{"$ref":"#/components/schemas/FacebookPaging"},{"type":"null"}]}},"type":"object","required":["data"],"title":"FacebookPostsResponse","description":"Facebook posts API response payload."},"FeedbackContext":{"properties":{"page_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Url","description":"URL the user was on when they sent feedback."},"error_details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Details","description":"Any error text or stack trace relevant to the report."},"environment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Environment","description":"Where this came from (e.g. 'production', 'n8n', a script name)."}},"additionalProperties":true,"type":"object","title":"FeedbackContext","description":"Optional context attached to a feedback submission.\n\nThe common fields are documented so an API consumer knows what to send, but\n`extra=\"allow\"` keeps it open: a caller can attach any additional keys (their\nown debug fields) without us rejecting the request. The whole object is stored\nas-is on the feedback row."},"FeedbackRequest":{"properties":{"type":{"type":"string","enum":["bug","feature","feedback"],"title":"Type","description":"Feedback type"},"message":{"type":"string","maxLength":5000,"minLength":1,"title":"Message","description":"Feedback message"},"context":{"anyOf":[{"$ref":"#/components/schemas/FeedbackContext"},{"type":"null"}],"description":"Optional context (e.g. page URL, error details, environment info)."}},"additionalProperties":false,"type":"object","required":["type","message"],"title":"FeedbackRequest"},"FeedbackResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Feedback record ID"},"status":{"type":"string","title":"Status","description":"Feedback status","default":"received"}},"type":"object","required":["id"],"title":"FeedbackResponse"},"FetchAccountStatsRequest":{"properties":{"integration_id":{"type":"string","title":"Integration Id","description":"Integration UUID (stored alongside snapshots)"},"platform":{"type":"string","title":"Platform","description":"Social platform identifier","x-extensible-enum":["facebook","linkedin","instagram"]},"account_id":{"type":"string","title":"Account Id","description":"Primary account identifier (e.g. page owner)"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id","description":"Page ID when platform distinguishes between account/user and page. Defaults to account_id when not provided."},"token":{"type":"string","title":"Token","description":"Platform access token"},"since":{"type":"string","title":"Since","description":"Start date (YYYY-MM-DD, inclusive)"},"until":{"type":"string","title":"Until","description":"End date (YYYY-MM-DD, inclusive)"},"periods":{"items":{"type":"string","enum":["day","week","days_28","lifetime"]},"type":"array","title":"Periods","description":"List of aggregation periods to fetch"}},"type":"object","required":["integration_id","platform","account_id","token","since","until"],"title":"FetchAccountStatsRequest","description":"Payload from Supabase trigger to fetch account stats.","examples":[{"account_id":"page-123","integration_id":"int-123","periods":["day"],"platform":"facebook","since":"2024-01-01","token":"token","until":"2024-01-31"}]},"FetchAccountStatsResponse":{"properties":{"snapshots_inserted":{"type":"integer","title":"Snapshots Inserted","description":"Number of snapshots inserted"}},"type":"object","required":["snapshots_inserted"],"title":"FetchAccountStatsResponse","description":"Simple response summarizing the sync operation.","examples":[{"snapshots_inserted":31}]},"FetchMeta":{"properties":{"version":{"type":"string","title":"Version"},"platform":{"type":"string","title":"Platform"},"account_id":{"type":"string","title":"Account Id"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id"},"since":{"type":"string","format":"date","title":"Since"},"until":{"type":"string","format":"date","title":"Until"},"periods":{"items":{"type":"string","enum":["day","week","days_28","lifetime"]},"type":"array","title":"Periods"}},"type":"object","required":["version","platform","account_id","since","until","periods"],"title":"FetchMeta"},"FetchRSSRequest":{"properties":{"feed_url":{"type":"string","title":"Feed Url","description":"URL of the RSS/Atom feed"},"max_results":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Max Results","default":10}},"type":"object","required":["feed_url"],"title":"FetchRSSRequest"},"FetchRSSResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RSSItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"FetchRSSResponse"},"FetchResponse":{"properties":{"meta":{"$ref":"#/components/schemas/FetchMeta"},"metrics":{"items":{"$ref":"#/components/schemas/MetricDescriptor"},"type":"array","title":"Metrics"},"snapshots":{"items":{"$ref":"#/components/schemas/Snapshot"},"type":"array","title":"Snapshots"}},"type":"object","required":["meta","metrics","snapshots"],"title":"FetchResponse"},"FieldBudget":{"properties":{"field":{"type":"string","title":"Field","description":"The field this budget applies to."},"limit":{"type":"integer","title":"Limit","description":"Hard ceiling, in characters."},"used":{"type":"integer","title":"Used","description":"Length of the field's current value, 0 when unset."},"remaining":{"type":"integer","title":"Remaining","description":"Characters left before the hard limit, floored at 0. This is the room a REPLACEMENT value has, since writing a budgeted field replaces it whole."}},"type":"object","required":["field","limit","used","remaining"],"title":"FieldBudget","description":"How much room a size-budgeted field has left, reported BEFORE a write.\n\nThe warning above is the after-the-fact half of the same idea, and on its own\nit guarantees a wasted rewrite: the only way to learn the ceiling was to hit\nit, so an agent composing a strategy doc wrote the whole thing, got told it\nwas too long, and wrote the whole thing again. Measured 2026-08-09 across the\n51 prod businesses with a strategy doc: 23 of them (45%) sat at or past the\nsoft limit, i.e. that second pass was the normal path, not the exception.\n\nSo the budget also ships on the way OUT, on every business read and write. An\nagent that reads `remaining` before composing does not need the warning."},"FieldUpdate-Input":{"properties":{"field":{"$ref":"#/components/schemas/VoiceField"},"new_value":{"type":"string","title":"New Value","description":"The COMPLETE value the field should have after this update. If the field currently has content, merge your changes into it — preserve anything that's still accurate and add new observations. For caption_writing_rules: use a bulleted list, one rule per line."},"change_summary":{"type":"string","title":"Change Summary","description":"One sentence explaining what was learned from the posts."}},"type":"object","required":["field","new_value","change_summary"],"title":"FieldUpdate"},"FieldUpdate-Output":{"properties":{"field":{"$ref":"#/components/schemas/UpdateField"},"change_summary":{"type":"string","title":"Change Summary","description":"One sentence explaining to the user what we learned from their edit. Written in second person, plain language."},"field_after":{"type":"string","title":"Field After","description":"The COMPLETE value the field should have after this update. If the field is currently empty, just write the new value — do NOT include '(empty)', 'Not set', or any placeholder. If the field has existing content, merge your change into it. For list fields (ctas): the single CTA string to add or update. For all other fields: the full replacement value."},"list_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"List Index","description":"For list fields (ctas): 0-based index to update, or null to append."}},"type":"object","required":["field","change_summary","field_after"],"title":"FieldUpdate"},"FieldWarning":{"properties":{"field":{"type":"string","title":"Field","description":"The field this warning is about, e.g. 'strategy', 'caption' or 'platform_overrides[0].caption'."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Stable machine-readable code, e.g. 'cta_without_contact'. Branch on this, never on the message. Null on the older size-budget warnings."},"level":{"type":"string","enum":["approaching_limit","over_limit","advisory"],"title":"Level","description":"'approaching_limit' = past the soft limit, act soon. 'over_limit' = past the hard limit, act now. 'advisory' = worth fixing before this publishes, but it may be intended."},"message":{"type":"string","title":"Message","description":"Plain-language explanation of what is wrong and how to fix it."}},"type":"object","required":["field","level","message"],"title":"FieldWarning","description":"One \"this is fine, but fix it soon\" note about a field the caller just read.\n\nA warning never blocks the write — see BusinessResponse.warnings for why.\nThis is the ONE non-blocking warnings shape (README F6): business size\nbudgets and post caption lint both use it, and so will later checks, so a\ncaller that loops over `warnings` keeps working as codes are added."},"FigureComponent":{"properties":{"type":{"type":"string","const":"figure","title":"Type","default":"figure"},"id":{"type":"string","title":"Id"},"subType":{"type":"string","title":"Subtype"},"x":{"type":"number","title":"X"},"y":{"type":"number","title":"Y"},"width":{"type":"number","title":"Width"},"height":{"type":"number","title":"Height"},"fill":{"type":"string","title":"Fill"},"stroke":{"type":"string","title":"Stroke","default":""},"strokeWidth":{"type":"number","title":"Strokewidth","default":0.0},"cornerRadius":{"type":"number","title":"Cornerradius","default":0.0},"name":{"type":"string","title":"Name","default":""},"filters":{"additionalProperties":true,"type":"object","title":"Filters","default":{}},"opacity":{"type":"number","title":"Opacity","default":1.0},"rotation":{"type":"number","title":"Rotation","default":0.0},"animations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Animations","default":[]},"blurRadius":{"type":"number","title":"Blurradius","default":0.0},"brightness":{"type":"number","title":"Brightness","default":0.0},"shadowBlur":{"type":"number","title":"Shadowblur","default":0.0},"shadowOffsetX":{"type":"number","title":"Shadowoffsetx","default":0.0},"shadowOffsetY":{"type":"number","title":"Shadowoffsety","default":0.0},"shadowColor":{"type":"string","title":"Shadowcolor","default":"black"},"shadowOpacity":{"type":"number","title":"Shadowopacity","default":1.0},"dash":{"items":{},"type":"array","title":"Dash","default":[]},"blurEnabled":{"type":"boolean","title":"Blurenabled","default":false},"brightnessEnabled":{"type":"boolean","title":"Brightnessenabled","default":false},"sepiaEnabled":{"type":"boolean","title":"Sepiaenabled","default":false},"grayscaleEnabled":{"type":"boolean","title":"Grayscaleenabled","default":false},"shadowEnabled":{"type":"boolean","title":"Shadowenabled","default":false},"visible":{"type":"boolean","title":"Visible","default":true},"selectable":{"type":"boolean","title":"Selectable","default":true},"removable":{"type":"boolean","title":"Removable","default":true},"alwaysOnTop":{"type":"boolean","title":"Alwaysontop","default":false},"showInExport":{"type":"boolean","title":"Showinexport","default":true},"draggable":{"type":"boolean","title":"Draggable","default":true},"resizable":{"type":"boolean","title":"Resizable","default":true},"contentEditable":{"type":"boolean","title":"Contenteditable","default":true},"styleEditable":{"type":"boolean","title":"Styleeditable","default":true},"custom":{"$ref":"#/components/schemas/FigureMeta"}},"type":"object","required":["subType","x","y","width","height","fill"],"title":"FigureComponent"},"FigureMeta":{"properties":{"colorType":{"$ref":"#/components/schemas/ColorType","default":"AUTO"},"strokeColorType":{"$ref":"#/components/schemas/ColorType","default":"AUTO"}},"type":"object","title":"FigureMeta"},"FileCreateRequest":{"properties":{"path":{"type":"string","title":"Path","description":"File path (e.g. '/documents/my-notes')"},"content":{"type":"string","title":"Content","description":"File content (markdown)"}},"additionalProperties":false,"type":"object","required":["path","content"],"title":"FileCreateRequest"},"FileCreateResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Created file ID"},"path":{"type":"string","title":"Path","description":"Full file path"},"name":{"type":"string","title":"Name","description":"File name (the last path segment), matching list/get responses"}},"type":"object","required":["id","path","name"],"title":"FileCreateResponse"},"FileInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"path":{"type":"string","title":"Path"},"resource_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"attached_images":{"type":"integer","title":"Attached Images","default":0},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","path"],"title":"FileInfo","description":"File information from glob search."},"FileResponse":{"properties":{"id":{"type":"string","title":"Id","description":"File ID"},"business_id":{"type":"string","title":"Business Id","description":"Business this file belongs to"},"name":{"type":"string","title":"Name","description":"File name"},"path":{"type":"string","title":"Path","description":"Full file path"},"body_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Text","description":"Markdown content"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent folder ID"},"media":{"items":{"$ref":"#/components/schemas/MediaResponse"},"type":"array","title":"Media","description":"Attached media"},"created_at":{"type":"string","title":"Created At","description":"When the file was created"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update time"}},"type":"object","required":["id","business_id","name","path","created_at"],"title":"FileResponse"},"FileSearchRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID to search files within"},"query":{"type":"string","title":"Query","description":"Search query text"},"max_files":{"type":"integer","title":"Max Files","description":"Maximum number of files to return","default":3}},"type":"object","required":["business_id","query"],"title":"FileSearchRequest","description":"Request to search for relevant files.","examples":[{"business_id":"biz-123","max_files":3,"query":"marketing strategy documents"}]},"FileSearchResponse":{"properties":{"file_ids":{"items":{"type":"string"},"type":"array","title":"File Ids","description":"List of file IDs (DEPRECATED: Use files instead)"},"files":{"items":{"$ref":"#/components/schemas/ResourceSummary"},"type":"array","title":"Files","description":"List of file summaries with metadata"}},"type":"object","required":["file_ids","files"],"title":"FileSearchResponse","description":"Response with list of relevant file IDs.","examples":[{"file_ids":["file-1","file-2"],"files":[]}]},"FileSummarizeRequest":{"properties":{"payload":{"$ref":"#/components/schemas/ResourceWebhookPayload"}},"type":"object","required":["payload"],"title":"FileSummarizeRequest"},"FileUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"New file name"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"New markdown content"}},"additionalProperties":false,"type":"object","title":"FileUpdateRequest"},"FillGuideInput":{"properties":{"page_number":{"type":"integer","title":"Page Number","description":"Page number (1-based)","default":1},"instructions":{"type":"string","title":"Instructions","description":"Instructions for this text slot","default":""},"max_characters":{"type":"integer","title":"Max Characters","description":"Max character count","default":100},"type":{"type":"string","title":"Type","description":"Slot type string","default":"CUSTOM"}},"type":"object","title":"FillGuideInput","description":"Simplified fill guide from the frontend — 1-based page numbers, string types."},"FillTemplateRequest":{"properties":{"template_id":{"type":"string","title":"Template Id"},"business_id":{"type":"string","title":"Business Id"},"text_content":{"additionalProperties":{"type":"string"},"type":"object","title":"Text Content"},"palette":{"items":{"type":"string"},"type":"array","title":"Palette"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"filler_media":{"additionalProperties":{"$ref":"#/components/schemas/FillerMediaItem"},"type":"object","title":"Filler Media","default":{}},"header_font":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Header Font"},"body_font":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Body Font"},"logo_background_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Background Color"},"ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ratio"},"text_position_overrides":{"anyOf":[{"additionalProperties":{"additionalProperties":{"type":"number"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Text Position Overrides"}},"type":"object","required":["template_id","business_id","text_content","palette"],"title":"FillTemplateRequest"},"FillerMediaInput":{"properties":{"url":{"type":"string","title":"Url","description":"Public URL of the image."},"media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Id","description":"Optional Marky media id this image came from."},"search_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Term","description":"Optional search term that sourced this image."}},"additionalProperties":false,"type":"object","required":["url"],"title":"FillerMediaInput","description":"An image to place into one FILLER image slot."},"FillerMediaItem":{"properties":{"url":{"type":"string","title":"Url"},"media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Id"},"search_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Term"}},"type":"object","required":["url"],"title":"FillerMediaItem"},"FlagProblemRequest":{"properties":{"category":{"type":"string","title":"Category","description":"Category of the reported problem","x-extensible-enum":["DESIGN_TEXT","DESIGN_PHOTOS","DESIGN_STYLE","CAPTION","OTHER"]},"details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Details","description":"Optional details about the problem"}},"additionalProperties":false,"type":"object","required":["category"],"title":"FlagProblemRequest"},"FlagProblemResponse":{"properties":{"success":{"type":"boolean","title":"Success"}},"additionalProperties":false,"type":"object","required":["success"],"title":"FlagProblemResponse"},"FolderCreateRequest":{"properties":{"name":{"type":"string","title":"Name","description":"Folder name"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent folder ID (for nesting)"}},"additionalProperties":false,"type":"object","required":["name"],"title":"FolderCreateRequest"},"FolderResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Folder ID"},"business_id":{"type":"string","title":"Business Id","description":"Business this folder belongs to"},"name":{"type":"string","title":"Name","description":"Folder name"},"path":{"type":"string","title":"Path","description":"Full folder path"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent folder ID"},"created_at":{"type":"string","title":"Created At","description":"When the folder was created"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update time"}},"type":"object","required":["id","business_id","name","path","created_at"],"title":"FolderResponse"},"FolderUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"New folder name"}},"additionalProperties":false,"type":"object","title":"FolderUpdateRequest"},"FollowerSnapshot":{"properties":{"integration_id":{"type":"string","title":"Integration Id","description":"Integration (connected account) the snapshot is for"},"platform":{"type":"string","title":"Platform","description":"Platform the snapshot is for (e.g. instagram, facebook)"},"metric_slug":{"type":"string","title":"Metric Slug","description":"Platform metric slug (e.g. followers, page_fans)"},"value":{"type":"number","title":"Value","description":"Metric value at window_end"},"window_end":{"type":"string","title":"Window End","description":"End of the snapshot window (ISO timestamp)"},"period":{"type":"string","title":"Period","description":"Aggregation period of the snapshot (e.g. day, week, lifetime)"}},"type":"object","required":["integration_id","platform","metric_slug","value","window_end","period"],"title":"FollowerSnapshot","description":"One follower-metric snapshot from analytics.social_account_snapshots."},"Font":{"properties":{"fontFamily":{"type":"string","title":"Fontfamily"},"url":{"type":"string","title":"Url"}},"type":"object","required":["fontFamily","url"],"title":"Font"},"FontSetting":{"properties":{"name":{"type":"string","title":"Name","description":"Font family name, e.g. 'Montserrat'. Must be a font Marky can load (a Google Font, or one with a direct url below)."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Direct font file URL. Leave null for a Google Font (Marky resolves it by name)."}},"additionalProperties":false,"type":"object","required":["name"],"title":"FontSetting"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","title":"Email","description":"User email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"FormatClicks":{"properties":{"format":{"type":"string","title":"Format","description":"Post format, e.g. carousel, image, video"},"clicks":{"type":"integer","title":"Clicks","description":"Total link clicks across these posts"},"n":{"type":"integer","title":"N","description":"How many posts of this format were published"}},"type":"object","required":["format","clicks","n"],"title":"FormatClicks","description":"Clicks and post count for one format over the window."},"FormatTranscriptRequest":{"properties":{"text":{"type":"string","title":"Text","description":"Raw transcript text as returned by the STT engine."},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context","description":"Optional context passed to the LLM to guide formatting (e.g., the draft's topic or category)."}},"type":"object","required":["text"],"title":"FormatTranscriptRequest"},"FormatTranscriptResponse":{"properties":{"text":{"type":"string","title":"Text","description":"Cleaned transcript text."}},"type":"object","required":["text"],"title":"FormatTranscriptResponse"},"FrameTextRequest":{"properties":{"media_url":{"type":"string","title":"Media Url","description":"Direct mp4 URL — typically from analytics.external_posts.media_url or POST /social-video/resolve."}},"type":"object","required":["media_url"],"title":"FrameTextRequest"},"FrameTextResponse":{"properties":{"text":{"type":"string","title":"Text","description":"Title text overlaid on the first frame, or empty string when no title overlay was detected. Caller should treat empty as a normal outcome (lots of videos have no overlay) and not an error."}},"type":"object","required":["text"],"title":"FrameTextResponse"},"GeminiSettingsRequest":{"properties":{"api_key":{"type":"string","title":"Api Key","description":"Google AI / Gemini API key"}},"type":"object","required":["api_key"],"title":"GeminiSettingsRequest"},"GeminiSettingsResponse":{"properties":{"has_key":{"type":"boolean","title":"Has Key","description":"Whether a Gemini BYOK key is set"},"masked_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Masked Key","description":"Masked API key (last 4 chars)"}},"type":"object","required":["has_key","masked_key"],"title":"GeminiSettingsResponse"},"GenBrandRequest":{"properties":{"content":{"type":"string","minLength":100,"title":"Content","description":"Markdown or plain text content to analyze"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Language of the content"}},"type":"object","required":["content"],"title":"GenBrandRequest"},"GenCaptionRequest":{"properties":{"topic":{"type":"string","title":"Topic","description":"Topic title or directive to generate a caption for"}},"type":"object","required":["topic"],"title":"GenCaptionRequest"},"GenCaptionResponse":{"properties":{"caption":{"type":"string","title":"Caption","description":"Generated caption text"}},"type":"object","required":["caption"],"title":"GenCaptionResponse"},"GenDesignTextRequest":{"properties":{"prompt_inputs":{"$ref":"#/components/schemas/PostTextPromptInputs","description":"Context for text generation"},"fill_guides":{"additionalProperties":{"$ref":"#/components/schemas/FillGuideInput"},"type":"object","title":"Fill Guides","description":"component_id → fill guide for each text slot"},"caption":{"type":"string","title":"Caption","description":"Existing caption text for context","default":""}},"type":"object","required":["prompt_inputs","fill_guides"],"title":"GenDesignTextRequest"},"GenDesignTextResponse":{"properties":{"filled_text":{"additionalProperties":{"type":"string"},"type":"object","title":"Filled Text","description":"component_id → generated text"}},"type":"object","required":["filled_text"],"title":"GenDesignTextResponse"},"GenTopicsRequest":{"properties":{"content":{"type":"string","minLength":100,"title":"Content","description":"Markdown or plain text content to analyze"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Language of the content"}},"type":"object","required":["content"],"title":"GenTopicsRequest"},"GenerateClientPreviewOTCRequest":{"properties":{"client_user_id":{"type":"string","title":"Client User Id","description":"The client user's ID"},"business_id":{"type":"string","title":"Business Id","description":"The business ID"}},"type":"object","required":["client_user_id","business_id"],"title":"GenerateClientPreviewOTCRequest"},"GenerateFromBriefsRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business to generate posts for"},"briefs":{"items":{"$ref":"#/components/schemas/PostRecipe"},"type":"array","title":"Briefs","description":"Post briefs to generate from"},"include_stock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Stock","description":"Override stock photo preference"},"audio_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Audio Tags","description":"Music style tags for video posts"},"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url","description":"Specific audio track URL for video posts"},"palettes":{"anyOf":[{"items":{"items":{"type":"string"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Palettes","description":"Override color palettes"},"voice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice","description":"Override brand voice"},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"Override aspect ratio"}},"type":"object","required":["business_id","briefs"],"title":"GenerateFromBriefsRequest"},"GenerateImageRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"Text prompt for image generation"},"on_image_text":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"On Image Text","description":"Every word that must appear on the image, as an ordered list of lines drawn word for word. Line 1 is the headline; the rest are supporting lines under it, in order. When the user gave you the words (a quote, a testimonial, a slogan, an offer, a name), copy them here VERBATIM and unshortened, however long, each as its own line, e.g. [\"What our clients say\", \"<the full quote>\", \"<who said it>\"]. Only words you write yourself should be short: a 3 to 6 word headline, because a graphic is seen for a second. Do NOT repeat these lines in `prompt`, and never put words meant for the image only in `prompt`: quoted text there that is missing from this list is refused. Leave this empty for a multi-panel grid where each panel carries its own copy; write that copy in `prompt`."},"business_id":{"type":"string","title":"Business Id","description":"Business ID to deduct credits from"},"image_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Image Urls","description":"Optional reference images (list of URLs)"},"media_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Ids","description":"Optional reference images addressed by their library media_id — the id `search_media_library`, `get_post` (media_details[].id) and `generate_or_edit_image` itself hand back. PREFER this over image_urls whenever you have an id: a 36-character id gets checked, so a slip comes back as 'no media with that id', while one wrong character in a 150-character CDN URL fails as a dead image link. Resolved server-side, so there is no URL to look up first. Ids from another workspace are skipped. Combines with image_urls and include_business_logo; ids come first."},"include_business_logo":{"type":"boolean","title":"Include Business Logo","description":"Append this business's logo as a reference image. Prefer this over pasting the logo URL into image_urls: agents retype the URL from their context and transpose characters in the UUID, which fails the whole generation. No-op when the business has no logo.","default":false},"place_business_logo":{"anyOf":[{"type":"string","enum":["top_left","top_right","bottom_left","bottom_right"]},{"type":"null"}],"title":"Place Business Logo","description":"Paste this business's real logo file into this corner of the finished image. Use it whenever the graphic should carry the logo: it is the only way to get the EXACT mark, because an image model asked to copy a logo redraws it in its own style. The model is told to draw no logo and keep that corner clear, so do not describe the logo in `prompt`. Takes precedence over include_business_logo. No-op when the business has no logo."},"aspect_ratio":{"anyOf":[{"type":"string","enum":["1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"]},{"type":"null"}],"title":"Aspect Ratio","description":"Optional aspect ratio"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline","description":"DEPRECATED: use on_image_text. Still accepted for one release and drawn as the first line."},"subline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subline","description":"DEPRECATED: use on_image_text. Still accepted for one release and drawn after headline."},"model":{"type":"string","title":"Model","description":"DEPRECATED and ignored. Every image renders on the one model Marky uses (see modules/images/model_selection.py). Kept as a free string, not a Literal, so saved recipes and older frontend bundles that still send a retired model id keep working instead of 422ing.","default":"auto"}},"type":"object","required":["prompt","business_id"],"title":"GenerateImageRequest","description":"Request for Gemini image generation.","examples":[{"aspect_ratio":"4:5","business_id":"xxx","image_urls":["https://example.com/photo.jpg","https://example.com/logo.png"],"prompt":"Create social media graphic with eco-friendly vibes"}]},"GenerateImageResponse":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"business_id":{"type":"string","title":"Business Id"},"task_type":{"type":"string","title":"Task Type"},"status":{"type":"string","title":"Status"},"external_task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Task Id"},"state":{"additionalProperties":true,"type":"object","title":"State"},"duration_dimensions":{"additionalProperties":true,"type":"object","title":"Duration Dimensions"},"progress":{"type":"integer","title":"Progress","default":0},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"timeout_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timeout At"},"estimated_ready_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Estimated Ready At"},"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration"},"retry_count":{"type":"integer","title":"Retry Count","default":0},"max_retries":{"type":"integer","title":"Max Retries","default":3},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"S3 URL of the generated image. Populated only when the request ran inline (X-MCP-Blocking)."},"media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Id","description":"The generated image's id in this workspace's media library. PREFER THIS OVER image_url when you pass the image to another tool: `create_post` and `generate_or_edit_image` itself both take `media_ids`, so an edit chain never has to touch a URL at all. An id is short enough to copy without corrupting it; a long CDN URL is not — one wrong character in the hostname is a different address, and the failure reads as 'your image link is dead' rather than 'you mistyped it'. Null only if the library row could not be written; use image_url then."},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Stable failure code (e.g. IMAGE_SAFETY_BLOCKED). Populated only when inline generation failed."},"cost_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost Usd","description":"INTERNAL COST ACCOUNTING, not a price and not a credit charge. What this generation cost Marky: per-image COGS times the number of images generated. 0.0 for BYOK orgs, who pay Google directly. Max's mcp_tools_middleware reads this into the LangSmith trace cost and STRIPS it before the agent sees the result (marky-llm src/modules/agent/tool_cost.py), so our cost of goods never reaches a user. Any new paid tool can opt in by returning the same field."}},"type":"object","required":["business_id","task_type","status"],"title":"GenerateImageResponse","description":"AsyncTaskRecord + the finished image_url when the request ran inline.\n\nDefault (web FE) path: `image_url` is None; the FE reads `id` and polls\nGET /multimodal/task/{task_id} as it always has.\n\nMCP/agent path (X-MCP-Blocking header set): the route runs generation inline,\ncompletes the task, and returns with `image_url` populated so the agent sees\nthe URL in the tool result on the same turn instead of getting a bare task id\nand hallucinating \"it's generating, I'll share when ready\" (Slack #Max, 2026-08-01)."},"GenerateMusicRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID for storage organization"},"prompt":{"type":"string","title":"Prompt","description":"Text description of the music to generate"},"duration":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":1.0},{"type":"null"}],"title":"Duration","description":"Duration in seconds (default: 30, max: 60)"},"style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style","description":"Optional music style (e.g., 'upbeat', 'calm', 'energetic')"}},"type":"object","required":["business_id","prompt"],"title":"GenerateMusicRequest","description":"Request for music generation.","examples":[{"business_id":"biz-456","duration":30,"prompt":"upbeat electronic music","style":"energetic"}]},"GenerateOTCRequest":{"properties":{"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"Target user ID. If omitted, generates OTC for the authenticated user."}},"type":"object","title":"GenerateOTCRequest"},"GeneratePostsRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business to generate posts for"},"post_count":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Post Count","description":"Number of posts to generate","default":1},"topic_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Topic Ids","description":"Override topic selection with specific IDs (cycled as needed)"},"template_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Template Ids","description":"Override template selection with specific IDs (cycled as needed)"},"custom_topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Topic","description":"Pass a topic string directly without DB lookup. Mutually exclusive with topic_ids."},"custom_idea":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Idea","description":"Skip ideation and use this idea string directly for all posts"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url","description":"Scrape this URL and use its content as additional context for generation"},"resource_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Resource Ids","description":"IDs of resources whose body_text is used as additional context for generation"},"image_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Image Urls","description":"Use these image URLs instead of searching stock providers. Round-robin assigned to image slots across posts."},"media_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Ids","description":"Narrow image search to these specific business_media IDs instead of searching the full library."},"creative_formats":{"anyOf":[{"items":{"type":"string","x-extensible-enum":["design","carousel","meme","image","gif","video","ai-image","ai-video"]},"type":"array"},{"type":"null"}],"title":"Creative Formats","description":"Creative format per post (round-robin cycled). Options:\n- 'design' (default): a branded graphic on a template. Use this for almost any 'make me an image/post' request.\n- 'ai-image': an AI-generated image. Pair with ai_image_type ('design', 'photo', 'infographic', or 'meme') to pick the look.\n- 'carousel': multi-page swipeable template.\n- 'meme': meme template.\n- 'video' / 'ai-video': video posts.\n- 'gif': a single GIF + caption.\n- 'image': a single raw STOCK photo + caption, with NO design, branding, or AI. This is rarely what you want — do NOT use 'image' when the user asks for a graphic or a generated image; use 'design' or 'ai-image' instead. 'image' only fits 'just put a plain stock photo on it'."},"include_stock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Stock","description":"When true, use Unsplash + Pexels stock photos + library. When false, library only. When null (default), use the business's preference."},"top_k":{"anyOf":[{"type":"integer","maximum":30.0,"minimum":1.0},{"type":"null"}],"title":"Top K","description":"When set, score all generated posts and only return the top K. Triggers LLM quality scoring."},"audio_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Audio Tags","description":"Music style tags for video posts (e.g. 'upbeat', 'chill', 'corporate'). Searched on Openverse. When null, uses the business's audioTags preference."},"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url","description":"Specific music track URL to use for video posts. When set, skips audio_tags search."},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"Override aspect ratio for templates (e.g. '1:1', '9:16', '4:5'). When null, uses the business's preference."},"palettes":{"anyOf":[{"items":{"items":{"type":"string"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Palettes","description":"Override color palettes. Each palette is a list of hex colors."},"voice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice","description":"Override brand voice/tone instructions for this generation."},"caption_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Suffix","description":"Override caption ending (hashtags, CTA, etc.)"},"caption_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Instructions","description":"Override caption writing rules for this generation."},"custom_caption_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Caption Prompt","description":"Override custom caption system prompt."},"custom_meme_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Meme Prompt","description":"Override custom meme system prompt."},"custom_carousel_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Carousel Prompt","description":"Override custom carousel system prompt."},"ctas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ctas","description":"Override CTAs (calls to action) for this generation. Used in design button text and caption voice context."},"first_comment_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Comment Text","description":"Override first comment text. When set, uses this instead of auto-prefilling from the post link. Set to empty string to disable first comment."},"ai_image_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Image Model","description":"DEPRECATED and ignored — every image renders on the one model Marky uses."},"ai_image_type":{"anyOf":[{"type":"string","enum":["design","photo","infographic","meme"]},{"type":"null"}],"title":"Ai Image Type","description":"Sub-type of AI image to generate. Picks a type-specific prompt template. Options: 'design' (graphic-designer aesthetic), 'photo' (photographic), 'infographic' (data/charts), 'meme' (funny image with punchline). Style (watercolor, photorealistic, etc.) is intentionally NOT encoded here — that comes from AI themes."},"ai_creative_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Creative Prompt","description":"Creative direction prompt for AI-generated content (ai-image and ai-video). For ai-video, describes the scene/shot. For ai-image, describes the visual. When not supplied, one is synthesized from the post's topic + idea."},"header_font":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Header Font","description":"Override header font for design templates. Shape: {family: str, url: str}."},"body_font":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Body Font","description":"Override body font for design templates. Shape: {family: str, url: str}."}},"type":"object","required":["business_id"],"title":"GeneratePostsRequest"},"GeneratePostsResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Async task ID. Watch via Supabase realtime on async_tasks table."},"posts":{"anyOf":[{"items":{"$ref":"#/components/schemas/PostResult"},"type":"array"},{"type":"null"}],"title":"Posts","description":"Populated only for backwards compatibility if generation completes synchronously (not used)."}},"type":"object","required":["task_id"],"title":"GeneratePostsResponse"},"GenerateQuestionsRequest":{"properties":{"business_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Name"},"business_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Description"},"business_industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Industry"},"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id"},"existing_questions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Existing Questions"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"count":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Count","default":5}},"type":"object","title":"GenerateQuestionsRequest"},"GenerateRequest":{"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"Plain text content to generate posts from (used as the post topic)."},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url","description":"URL to scrape for content context. The page text is used as input for generation."},"custom_idea":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Idea","description":"Skip ideation and use this text directly as the post idea for all generated posts."},"count":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Count","description":"Number of posts to generate (1-10).","default":1},"creative_formats":{"anyOf":[{"items":{"type":"string","x-extensible-enum":["design","carousel","meme","image","gif","video","ai-image","ai-video"]},"type":"array"},{"type":"null"}],"title":"Creative Formats","description":"Which post formats to generate (round-robins across the list). One or more of: design, carousel, meme, image, gif, video, ai-image, ai-video. Omit to use the business's default mix."},"ai_image_type":{"anyOf":[{"type":"string","enum":["design","photo","infographic","meme"]},{"type":"null"}],"title":"Ai Image Type","description":"Sub-type for AI-image generation (only used when a creative_format is 'ai-image'): design, photo, infographic, or meme."},"ai_image_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Image Style","description":"Visual style modifier for AI images (e.g. 'corporate-flat', 'isometric', 'comic'). Only used for 'ai-image'."},"template_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Template Ids","description":"Restrict design generation to these specific template IDs instead of auto-selecting."},"voice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice","description":"Override the brand voice/tone for this generation only (the business's saved Profile is used when omitted)."},"include_stock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Stock","description":"Whether stock photos (Unsplash/Pexels) may be used. Omit to use the business's saved preference."},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"Aspect ratio for generated media, e.g. '1:1' (square), '9:16' (story/reel), '4:5' (portrait). Omit for the business default."}},"additionalProperties":false,"type":"object","title":"GenerateRequest"},"GenerateShortsRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID for credit deduction"},"source_video_url":{"type":"string","title":"Source Video Url","description":"URL of the source video to process"},"target_clip_count":{"type":"integer","title":"Target Clip Count","description":"Number of clips to generate","default":5},"language":{"type":"string","title":"Language","description":"Language for captions","default":"en"},"captions":{"type":"boolean","title":"Captions","description":"Add captions to clips","default":true},"reframe":{"type":"boolean","title":"Reframe","description":"Reframe for vertical format","default":true},"min_duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Duration","description":"Minimum clip duration (seconds)"},"max_duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Duration","description":"Maximum clip duration (seconds)"},"style_preset_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style Preset Id","description":"Klap style preset ID"},"audio_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Url","description":"URL of audio file to add to shorts (takes precedence over audio_tags)"},"audio_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Audio Tags","description":"Tags to search for audio on Openverse (e.g., ['upbeat', 'electronic']). Use 'sound_effect' category for sound effects."}},"type":"object","required":["business_id","source_video_url"],"title":"GenerateShortsRequest","description":"Request to generate shorts from a long-form video."},"GenerateThumbnailResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Status of the thumbnail generation request"}},"type":"object","required":["status"],"title":"GenerateThumbnailResponse","description":"Response from thumbnail generation request.","examples":[{"status":"queued"}]},"GenerateVideoRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"Text prompt for video generation"},"starting_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Starting Image Url","description":"Optional primary image URL to use as the base for video generation. If not provided, an image will be generated from the prompt."},"business_id":{"type":"string","title":"Business Id","description":"Business ID for storage organization"},"duration_seconds":{"anyOf":[{"type":"integer","maximum":15.0,"minimum":4.0},{"type":"null"}],"title":"Duration Seconds","description":"Optional video duration in seconds. Must be between 4 and 15, inclusive. Veo models support 4-8 seconds. kie-kling-2.6 and kling-o1 support 5 or 10 seconds. sora-2-pro supports 10 or 15 seconds."},"model":{"type":"string","title":"Model","description":"Video generation model to use. veo-3.1-fast-generate-preview works with gemini/kie vendors. kling-o1 requires fal vendor. kie-kling-2.6 requires kie vendor (supports both text-to-video and image-to-video modes). sora-2-pro requires kie vendor and supports portrait (9:16) and landscape (16:9) aspect ratios.","default":"veo-3.1-fast-generate-preview","x-extensible-enum":["veo-3.1-fast-generate-preview","kling-o1","kie-kling-2.6","sora-2-pro"]},"reference_images":{"anyOf":[{"items":{"$ref":"#/components/schemas/ReferenceImage"},"type":"array"},{"type":"null"}],"title":"Reference Images","description":"Optional reference images for video generation. For kling-o1: use @Image1, @Image2 in prompt to reference style/appearance. Provide reference_angles in options to create elements for consistent character/object identity. For kie-kling-2.6: combined with starting_image_url into image_urls array for image-to-video mode."}},"type":"object","required":["prompt","business_id"],"title":"GenerateVideoRequest","description":"Request for Veo3 video generation.","examples":[{"business_id":"biz-456","image_url":"https://example.com/image.jpg","prompt":"Panning wide shot of a calico kitten sleeping in the sunshine"}]},"GenerateVoiceoverRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID for storage organization"},"text":{"type":"string","title":"Text","description":"Text to convert to speech"},"voice_id":{"type":"string","title":"Voice Id","description":"ElevenLabs voice ID (e.g., 'JBFqnCBsd6RMkjVDRZzb')"}},"type":"object","required":["business_id","text","voice_id"],"title":"GenerateVoiceoverRequest","description":"Request for voiceover generation.","examples":[{"business_id":"biz-456","text":"Hello, this is a test voiceover.","voice_id":"JBFqnCBsd6RMkjVDRZzb"}]},"GetAccountResponse":{"properties":{"viewer":{"$ref":"#/components/schemas/AccountViewer"},"plan":{"anyOf":[{"$ref":"#/components/schemas/AccountPlan"},{"type":"null"}],"description":"Null for anyone who does not manage billing. Never guess a plan."},"limits":{"anyOf":[{"$ref":"#/components/schemas/AccountLimits"},{"type":"null"}],"description":"Null for an agency's white-label client."},"credits":{"$ref":"#/components/schemas/AccountCredits"},"links":{"$ref":"#/components/schemas/AccountLinks"}},"type":"object","required":["viewer","plan","limits","credits","links"],"title":"GetAccountResponse","description":"Account facts this viewer may be told about this workspace's organization."},"GetFollowerStatsRequest":{"properties":{"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"The business whose connected accounts to read. Optional only because the web FE names it via the X-Business-Id header; MCP/agent callers must pass it here."},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform","description":"Filter by platform (e.g. \"instagram\", \"facebook\"). Leave empty for all."},"days_back":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Days Back","description":"How many days back to look (default 30)","default":30}},"type":"object","title":"GetFollowerStatsRequest","description":"Request for follower-count trends over connected social accounts."},"GetFollowerStatsResponse":{"properties":{"snapshots":{"items":{"$ref":"#/components/schemas/FollowerSnapshot"},"type":"array","title":"Snapshots","description":"Follower snapshots with platform, metric, and value over time (window_end desc)"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Set when there is nothing to return (no connected accounts or no data in range)."}},"type":"object","required":["snapshots"],"title":"GetFollowerStatsResponse","description":"Follower snapshots over the requested window, newest first."},"GetMediaUrlRequest":{"properties":{"media_id":{"type":"string","minLength":1,"title":"Media Id","description":"UUID of the media record in the business_media table."},"business_id":{"type":"string","minLength":1,"title":"Business Id","description":"Business (workspace) the media must belong to. The media is only resolved if it belongs to this business — mirrors the Max tool's ownership guard so one workspace can never read another's media."}},"type":"object","required":["media_id","business_id"],"title":"GetMediaUrlRequest","description":"Request to resolve the public URL of a library media item.","examples":[{"business_id":"biz-123","media_id":"a0c11111-1111-4111-8111-111111111111"}]},"GetMediaUrlResponse":{"properties":{"url":{"type":"string","title":"Url","description":"Public URL string for the media item."}},"type":"object","required":["url"],"title":"GetMediaUrlResponse","description":"The resolved public URL for a media item."},"GetPostStatsRequest":{"properties":{"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"The business to read stats for. Optional only because the web FE names it via the X-Business-Id header instead; MCP/agent callers must pass it here."},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform","description":"Filter by platform (e.g. \"instagram\", \"facebook\", \"linkedin\", \"twitter\", \"tiktok\"). Leave empty for all platforms."},"days_back":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Days Back","description":"How many days back to look (default 30).","default":30},"limit":{"type":"integer","maximum":2000.0,"minimum":1.0,"title":"Limit","description":"Max number of posts to return (default 50).","default":50}},"additionalProperties":false,"type":"object","title":"GetPostStatsRequest","description":"Request for recent post performance stats for one business."},"GetPostStatsResponse":{"properties":{"summary":{"type":"string","title":"Summary","description":"Human-readable summary (post count + likes/comments/shares/reach totals)."},"post_count":{"type":"integer","title":"Post Count","description":"Number of posts returned."},"total_likes":{"type":"integer","title":"Total Likes","description":"Sum of likes across returned posts."},"total_comments":{"type":"integer","title":"Total Comments","description":"Sum of comments across returned posts."},"total_shares":{"type":"integer","title":"Total Shares","description":"Sum of shares across returned posts."},"total_reach":{"type":"integer","title":"Total Reach","description":"Sum of reach across returned posts."},"posts":{"items":{"$ref":"#/components/schemas/PostStatRow"},"type":"array","title":"Posts","description":"Posts with their stats, sorted by published_at descending."}},"additionalProperties":false,"type":"object","required":["summary","post_count","total_likes","total_comments","total_shares","total_reach","posts"],"title":"GetPostStatsResponse","description":"Recent posts with their engagement/reach metrics plus a totals summary."},"GetSkillScheduleResponse":{"properties":{"schedule":{"anyOf":[{"$ref":"#/components/schemas/SkillScheduleResponse"},{"type":"null"}],"description":"The business's schedule, or null when Autopilot is not set up."}},"type":"object","required":["schedule"],"title":"GetSkillScheduleResponse"},"GetTaskStatusRequest":{"properties":{"task_id":{"type":"string","minLength":1,"title":"Task Id","description":"The task ID returned from async operations (e.g., edit_video)"}},"type":"object","required":["task_id"],"title":"GetTaskStatusRequest","description":"Request to poll the status of an async task."},"GetTranscriptRequest":{"properties":{"video_url":{"type":"string","title":"Video Url","description":"YouTube video URL"},"business_id":{"type":"string","title":"Business Id","description":"Business ID for task tracking"}},"type":"object","required":["video_url","business_id"],"title":"GetTranscriptRequest","description":"Request to get YouTube video transcript.","examples":[{"video_url":"https://www.youtube.com/watch?v=FdFSE5o2rcM"}]},"GetTranscriptResponse":{"properties":{"vtt_content":{"type":"string","title":"Vtt Content","description":"WebVTT formatted transcript"},"source":{"type":"string","title":"Source","description":"Source of transcript (e.g., 'youtube')"}},"type":"object","required":["vtt_content","source"],"title":"GetTranscriptResponse","description":"Response from transcript endpoint.","examples":[{"source":"youtube","vtt_content":"WEBVTT\n\n1\n00:00:00.080 --> 00:00:03.919\n..."}]},"GetVoiceSampleRequest":{"properties":{"voice_id":{"type":"string","title":"Voice Id","description":"ElevenLabs voice ID"},"sample_id":{"type":"string","title":"Sample Id","description":"Sample ID from the voice's samples list"},"business_id":{"type":"string","title":"Business Id","description":"Business ID for storage organization"}},"type":"object","required":["voice_id","sample_id","business_id"],"title":"GetVoiceSampleRequest","description":"Request for getting voice sample audio.","examples":[{"business_id":"biz-456","sample_id":"abc123","voice_id":"JBFqnCBsd6RMkjVDRZzb"}]},"GetVoiceSampleResponse":{"properties":{"audio_url":{"type":"string","title":"Audio Url","description":"URL of voice sample audio"}},"type":"object","required":["audio_url"],"title":"GetVoiceSampleResponse","description":"Response for voice sample audio.","examples":[{"audio_url":"https://..."}]},"GiphyResult":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url","description":"Direct URL to the GIF/MP4 file (prefers MP4)"},"thumbnail_url":{"type":"string","title":"Thumbnail Url","description":"Thumbnail image URL"},"title":{"type":"string","title":"Title","default":""},"width":{"type":"integer","title":"Width","default":0},"height":{"type":"integer","title":"Height","default":0}},"type":"object","required":["id","url","thumbnail_url"],"title":"GiphyResult","description":"A single GIF result from Giphy."},"GlobFilesRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID"},"pattern":{"type":"string","title":"Pattern","description":"Glob pattern to match (e.g., '/documents/*', '/documents/**')"},"max_results":{"type":"integer","title":"Max Results","description":"Maximum number of results","default":100},"long_format":{"type":"boolean","title":"Long Format","description":"If True, include created_at and updated_at timestamps","default":false}},"type":"object","required":["business_id","pattern"],"title":"GlobFilesRequest","description":"Request to list files matching a glob pattern.","examples":[{"business_id":"biz-123","pattern":"*"},{"business_id":"biz-123","pattern":"/documents/**"}]},"GlobFilesResponse":{"properties":{"files":{"items":{"$ref":"#/components/schemas/FileInfo"},"type":"array","title":"Files","description":"List of matching files"}},"type":"object","required":["files"],"title":"GlobFilesResponse","description":"Response from glob search."},"GoogleAuthRequest":{"properties":{"code":{"type":"string","title":"Code","description":"Google OAuth authorization code"},"attribution":{"anyOf":[{"$ref":"#/components/schemas/MarketingAttribution"},{"type":"null"}]}},"type":"object","required":["code"],"title":"GoogleAuthRequest"},"GoogleIdTokenRequest":{"properties":{"id_token":{"type":"string","title":"Id Token","description":"Google-issued ID token (JWT) from a mobile sign-in flow"},"attribution":{"anyOf":[{"$ref":"#/components/schemas/MarketingAttribution"},{"type":"null"}]}},"type":"object","required":["id_token"],"title":"GoogleIdTokenRequest"},"GrepMatch":{"properties":{"path":{"type":"string","title":"Path","description":"Full file path"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"Resource ID of the file"},"match_count":{"type":"integer","title":"Match Count","description":"Number of matching lines","default":0},"matches":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Matches","description":"Matched lines ({line_number, line}); empty when line_numbers=False"}},"type":"object","required":["path"],"title":"GrepMatch","description":"A single file that matched the grep pattern."},"GrepRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID"},"pattern":{"type":"string","minLength":1,"title":"Pattern","description":"Pattern to search for (regex by default, or literal if literal=True)"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path","description":"Optional file path to restrict the search (must start with '/' if provided). If None, searches all files."},"literal":{"type":"boolean","title":"Literal","description":"If True, treat pattern as a literal string (auto-escapes regex chars)","default":false},"case_insensitive":{"type":"boolean","title":"Case Insensitive","description":"If True, case-insensitive search (like `grep -i`). Note: the DB match is always case-insensitive.","default":false},"line_numbers":{"type":"boolean","title":"Line Numbers","description":"If True, include matched lines + line numbers in results (like `grep -n`)","default":true},"max_files":{"type":"integer","title":"Max Files","description":"Maximum number of files to return","default":10}},"type":"object","required":["business_id","pattern"],"title":"GrepRequest","description":"Request to search inside file contents (regex over resource body_text).","examples":[{"business_id":"biz-123","pattern":"TODO|FIXME"},{"business_id":"biz-123","case_insensitive":true,"path":"/logs/app.log","pattern":"error"}]},"GrepResponse":{"properties":{"pattern":{"type":"string","title":"Pattern","description":"The pattern that was searched for"},"files_searched":{"type":"integer","title":"Files Searched","description":"Number of files the RPC scanned"},"files_with_matches":{"type":"integer","title":"Files With Matches","description":"Number of files with matches"},"matches":{"items":{"$ref":"#/components/schemas/GrepMatch"},"type":"array","title":"Matches","description":"Per-file match results"}},"type":"object","required":["pattern","files_searched","files_with_matches","matches"],"title":"GrepResponse","description":"Response from a grep search."},"GroupComponent":{"properties":{"type":{"type":"string","const":"group","title":"Type","default":"group"}},"additionalProperties":true,"type":"object","title":"GroupComponent"},"GroupStats":{"properties":{"group_name":{"type":"string","title":"Group Name"},"group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Id"},"totals":{"additionalProperties":{"type":"integer"},"type":"object","title":"Totals"},"workspaces":{"items":{"$ref":"#/components/schemas/WorkspaceStats"},"type":"array","title":"Workspaces"}},"type":"object","required":["group_name","totals","workspaces"],"title":"GroupStats"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HashtagSuggestRequest":{"properties":{"keywords":{"items":{"type":"string"},"type":"array","maxItems":3,"title":"Keywords","description":"Keywords or topics to get hashtag suggestions for (max 3)"}},"type":"object","title":"HashtagSuggestRequest"},"HashtagSuggestResponseModel":{"properties":{"hashtags":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Hashtags","description":"List of hashtags with category and engagement_score for UI compatibility"}},"type":"object","required":["hashtags"],"title":"HashtagSuggestResponseModel"},"Holiday":{"properties":{"name":{"type":"string","title":"Name"},"date":{"type":"string","title":"Date"},"type":{"type":"string","title":"Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name","date","type"],"title":"Holiday"},"HostFileReference":{"properties":{"download_url":{"type":"string","title":"Download Url","description":"Server-fetchable http(s) URL for the file bytes. Marky downloads this server-side (SSRF + size guarded). Private and internal addresses are rejected."},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id","description":"The host's opaque id for the file. Informational only."},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type","description":"MIME type the host reports (e.g. `image/png`). Advisory only — Marky sniffs the actual bytes."},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name","description":"Original filename (e.g. `chart.png`). Helps detect video vs image when the URL and content type are ambiguous."}},"additionalProperties":false,"type":"object","required":["download_url"],"title":"HostFileReference","description":"A host-provided handle to a file the AGENT's platform holds for us to fetch.\n\nChatGPT's Apps SDK substitutes this object for a tool argument the tool marks\nvia tool-level `openai/fileParams` (stamped on the public MCP tool in\nmain.py). Instead of the model emitting raw bytes (impossible past a few\nhundred KB) or the sandbox PUTting to a presigned URL (hosted ChatGPT\nsandboxes block outbound uploads), ChatGPT passes the file BY REFERENCE and\nMarky fetches `download_url` server-side. See `upload_media_from_reference`."},"IdeaFeedItem":{"properties":{"idea_text":{"type":"string","title":"Idea Text"},"topic_id":{"type":"string","title":"Topic Id"},"topic_title":{"type":"string","title":"Topic Title"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name"},"category_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Color"}},"type":"object","required":["idea_text","topic_id","topic_title","category_id","category_name","category_color"],"title":"IdeaFeedItem","description":"One row in the idea feed shown on the home page."},"IdeaFeedResponse":{"properties":{"ideas":{"items":{"$ref":"#/components/schemas/IdeaFeedItem"},"type":"array","title":"Ideas"}},"type":"object","required":["ideas"],"title":"IdeaFeedResponse"},"ImageAsset":{"properties":{"id":{"type":"string","title":"Id"},"uri":{"type":"string","title":"Uri"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/ImageAssetMetadata"},{"type":"null"}]}},"type":"object","required":["id","uri"],"title":"ImageAsset","description":"Image asset definition."},"ImageAssetMetadata":{"properties":{"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"}},"type":"object","title":"ImageAssetMetadata","description":"Metadata for image assets."},"ImageBudget":{"properties":{"images_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Images Remaining","description":"Whole images the workspace can still generate. None means unlimited: the org brought its own Gemini key, so generation is free and no balance runs down."},"credits_remaining":{"type":"integer","title":"Credits Remaining","description":"Credits behind that number (monthly + bonus). 0 when unlimited."},"credits_per_image":{"type":"integer","title":"Credits Per Image","description":"Credits one image costs today."}},"type":"object","required":["images_remaining","credits_remaining","credits_per_image"],"title":"ImageBudget","description":"What is left to spend on AI images, in images."},"ImageComponent":{"properties":{"type":{"type":"string","const":"image","title":"Type","default":"image"},"id":{"type":"string","title":"Id"},"src":{"type":"string","title":"Src","default":""},"width":{"type":"number","title":"Width","default":100.0},"height":{"type":"number","title":"Height","default":100.0},"x":{"type":"number","title":"X","default":0.0},"y":{"type":"number","title":"Y","default":0.0},"name":{"type":"string","title":"Name","default":""},"filters":{"additionalProperties":true,"type":"object","title":"Filters","default":{}},"stretchEnabled":{"type":"boolean","title":"Stretchenabled","default":false},"rotation":{"type":"number","title":"Rotation","default":0.0},"blurEnabled":{"type":"boolean","title":"Blurenabled","default":false},"blurRadius":{"type":"number","title":"Blurradius","default":0},"brightnessEnabled":{"type":"boolean","title":"Brightnessenabled","default":false},"brightness":{"type":"number","title":"Brightness","default":0},"shadowEnabled":{"type":"boolean","title":"Shadowenabled","default":false},"shadowBlur":{"type":"number","title":"Shadowblur","default":0},"shadowOffsetX":{"type":"number","title":"Shadowoffsetx","default":0},"shadowOffsetY":{"type":"number","title":"Shadowoffsety","default":0},"shadowColor":{"type":"string","title":"Shadowcolor","default":""},"shadowOpacity":{"type":"number","title":"Shadowopacity","default":1.0},"keepRatio":{"type":"boolean","title":"Keepratio","default":false},"clipSrc":{"type":"string","title":"Clipsrc","default":""},"cropX":{"type":"number","title":"Cropx","default":0.0},"cropY":{"type":"number","title":"Cropy","default":0.0},"cropWidth":{"type":"number","title":"Cropwidth","default":1.0},"cropHeight":{"type":"number","title":"Cropheight","default":1.0},"cornerRadius":{"type":"number","title":"Cornerradius","default":0.0},"borderColor":{"type":"string","title":"Bordercolor","default":""},"borderSize":{"type":"number","title":"Bordersize","default":0.0},"flipX":{"type":"boolean","title":"Flipx","default":false},"flipY":{"type":"boolean","title":"Flipy","default":false},"selectable":{"type":"boolean","title":"Selectable","default":true},"alwaysOnTop":{"type":"boolean","title":"Alwaysontop","default":false},"showInExport":{"type":"boolean","title":"Showinexport","default":true},"draggable":{"type":"boolean","title":"Draggable","default":true},"contentEditable":{"type":"boolean","title":"Contenteditable","default":true},"removable":{"type":"boolean","title":"Removable","default":true},"resizable":{"type":"boolean","title":"Resizable","default":true},"animations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Animations","default":[]},"grayscaleEnabled":{"type":"boolean","title":"Grayscaleenabled","default":false},"opacity":{"type":"number","title":"Opacity","default":1.0},"sepiaEnabled":{"type":"boolean","title":"Sepiaenabled","default":false},"styleEditable":{"type":"boolean","title":"Styleeditable","default":true},"visible":{"type":"boolean","title":"Visible","default":true},"custom":{"$ref":"#/components/schemas/ImageMeta"}},"type":"object","title":"ImageComponent"},"ImageMeta":{"properties":{"type":{"type":"string","enum":["STATIC","FILLER","LOGO","AVATAR","LOGO_BACKGROUND","WATERMARK"],"title":"Type","default":"STATIC"},"image_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Id"},"search_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Term"}},"type":"object","title":"ImageMeta"},"ImageOverlay":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","const":"image","title":"Type"},"asset_id":{"type":"string","title":"Asset Id"},"start_time":{"type":"number","title":"Start Time"},"end_time":{"type":"number","title":"End Time"},"position":{"$ref":"#/components/schemas/OverlayPosition"},"size":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Size"},"layer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Layer"},"animation":{"anyOf":[{"$ref":"#/components/schemas/OverlayAnimation"},{"type":"null"}]}},"type":"object","required":["id","type","asset_id","start_time","end_time","position"],"title":"ImageOverlay","description":"Image overlay element."},"ImageSearchRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID to search images within"},"query":{"type":"string","title":"Query","description":"Search query text for semantic similarity"},"limit":{"type":"integer","title":"Limit","description":"Maximum number of results to return","default":20},"resource_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Resource Ids","description":"If provided, search only within these resources"}},"type":"object","required":["business_id","query"],"title":"ImageSearchRequest","description":"Request to search for library images.","examples":[{"business_id":"biz-123","limit":20,"query":"sunset beach landscape"}]},"ImageSearchResponse":{"properties":{"data":{"additionalProperties":true,"type":"object","title":"Data","description":"Search results containing images array"}},"type":"object","required":["data"],"title":"ImageSearchResponse","description":"Response with list of matching images.","examples":[{"data":{"images":[]}}]},"ImageSlot":{"properties":{"id":{"type":"string","title":"Id"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"required":{"type":"boolean","title":"Required"},"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"}},"type":"object","required":["id","required","width","height"],"title":"ImageSlot","description":"Image slot definition in a template page."},"ImageTaskStatusResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Async task ID"},"status":{"type":"string","title":"Status","description":"Task status: pending | processing | completed | failed"},"progress":{"type":"integer","title":"Progress","description":"Progress percentage (0-100)","default":0},"progress_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress Message","description":"Latest human-readable progress message"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"S3 URL of the generated image (set when completed)"},"media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Id","description":"The generated image's id in the workspace media library (set when completed). Pass this to `create_post` as `media_ids` rather than re-typing image_url."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"User-facing error message (set when failed)"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Stable error code (e.g. IMAGE_GENERATION_FAILED) when failed."}},"type":"object","required":["task_id","status"],"title":"ImageTaskStatusResponse","description":"Poll response for an image generation task.","examples":[{"image_url":"https://s3.amazonaws.com/bucket/generated-image.png","progress":100,"progress_message":"Image ready","status":"completed","task_id":"task-123"}]},"ImportChatPdfRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business the file belongs to"},"pdf_base64":{"type":"string","title":"Pdf Base64","description":"Base64-encoded PDF content"},"filename":{"type":"string","title":"Filename","description":"Original filename, used to name the file"}},"type":"object","required":["business_id","pdf_base64","filename"],"title":"ImportChatPdfRequest","description":"Request to turn a PDF dropped into chat into one Library file.","examples":[{"business_id":"biz-123","filename":"Brand Voice Guide.pdf","pdf_base64":"JVBERi0xLjQK..."}]},"ImportChatPdfResponse":{"properties":{"resource_id":{"type":"string","title":"Resource Id","description":"Resource ID of the created file"},"path":{"type":"string","title":"Path","description":"Full file path, e.g. '/Brand Voice Guide'"},"name":{"type":"string","title":"Name","description":"File name with no extension"},"char_count":{"type":"integer","title":"Char Count","description":"Characters of markdown extracted"}},"type":"object","required":["resource_id","path","name","char_count"],"title":"ImportChatPdfResponse","description":"The Library file the upload produced, ready to @mention in chat."},"ImportFromSourceRequest":{"properties":{"source_type":{"type":"string","title":"Source Type","description":"Source type: 'website', 'pdf', or 'text'"},"business_id":{"type":"string","title":"Business Id","description":"The business ID to import the content into"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id","description":"Parent folder ID. If None, creates at business root"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Website URL (required for website source_type)"},"crawl":{"type":"boolean","title":"Crawl","description":"Whether to crawl linked pages (website only)","default":false},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text","description":"Text content (required for text source_type)"},"pdf_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Base64","description":"Base64-encoded PDF content (required for pdf source_type)"},"pdf_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Filename","description":"PDF filename (for pdf source_type)"},"resource_type_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Resource Type Ids","description":"Optional resource type IDs for structured extraction"},"is_initial_setup":{"type":"boolean","title":"Is Initial Setup","description":"Flag indicating this is part of initial setup","default":false}},"type":"object","required":["source_type","business_id"],"title":"ImportFromSourceRequest","description":"Request to import content from a source.","examples":[{"business_id":"uuid","crawl":true,"parent_id":"folder-uuid","resource_type_ids":["event","product"],"source_type":"website","url":"https://example.com"}]},"ImportFromSourceResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Task ID for tracking import progress"},"message":{"type":"string","title":"Message","description":"Status message"}},"type":"object","required":["task_id","message"],"title":"ImportFromSourceResponse","description":"Response with task ID for async import.","examples":[{"message":"Import started. Check /tasks for progress.","task_id":"task-uuid"}]},"ImportRequest":{"properties":{"design_id":{"type":"string","title":"Design Id","description":"Canva design ID to export and import"},"business_id":{"type":"string","title":"Business Id","description":"Business to upload the image for"}},"type":"object","required":["design_id","business_id"],"title":"ImportRequest"},"ImportResponse":{"properties":{"url":{"type":"string","title":"Url","description":"S3 URL of the imported image"},"storage_path":{"type":"string","title":"Storage Path","description":"Storage path of the uploaded image"},"width":{"type":"integer","title":"Width","description":"Image width in pixels"},"height":{"type":"integer","title":"Height","description":"Image height in pixels"}},"type":"object","required":["url","storage_path","width","height"],"title":"ImportResponse"},"IndexImagePayload":{"properties":{"type":{"type":"string","title":"Type"},"table":{"type":"string","title":"Table"},"schema_name":{"type":"string","title":"Schema Name"},"record":{"$ref":"#/components/schemas/BusinessMediaRecord"},"old_record":{"anyOf":[{"$ref":"#/components/schemas/BusinessMediaRecord"},{"type":"null"}]}},"type":"object","required":["type","table","schema_name","record"],"title":"IndexImagePayload"},"IndexImageRequest":{"properties":{"payload":{"$ref":"#/components/schemas/IndexImagePayload"}},"type":"object","required":["payload"],"title":"IndexImageRequest"},"InlineTextStyle":{"properties":{"font_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Font Size"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"font_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Font Family"},"stroke_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stroke Color"},"stroke_width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Stroke Width"},"pop_scale":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pop Scale"},"fade_in_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fade In Ms"},"shadow":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shadow"},"blur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Blur"},"highlight_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Highlight Index"},"highlight_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Highlight Color"},"highlight_pop":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Highlight Pop"},"background_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Background Color"}},"type":"object","title":"InlineTextStyle","description":"Inline text style (used directly on overlay, not referenced by ID)."},"InsightFeedbackRequest":{"properties":{"rating":{"type":"string","enum":["up","down"],"title":"Rating","description":"Thumbs up or down"},"response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response","description":"Optional text feedback"},"segment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment","description":"Business industry segment"},"period_label":{"type":"string","title":"Period Label","description":"Period label shown","default":""},"post_count":{"type":"integer","title":"Post Count","description":"Number of posts in the period","default":0}},"type":"object","required":["rating"],"title":"InsightFeedbackRequest","description":"Request body for analytics insight feedback."},"IntegrationRecord":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"business_id":{"type":"string","title":"Business Id"},"hashed_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hashed Id"},"type":{"type":"string","title":"Type"},"username":{"type":"string","title":"Username"},"profile_user_id":{"type":"string","title":"Profile User Id"},"profile_picture":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Picture"},"auth_credentials":{"additionalProperties":true,"type":"object","title":"Auth Credentials","default":{}},"selected_page":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Selected Page"},"last_publish_result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Last Publish Result"},"publish_settings":{"additionalProperties":true,"type":"object","title":"Publish Settings","default":{}},"access_token_expiration_time":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Access Token Expiration Time"},"deleted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deleted At"},"status":{"$ref":"#/components/schemas/IntegrationStatus","default":"valid"},"invalid_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invalid Reason"},"invalidated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Invalidated At"},"last_reconnect_nudge_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Reconnect Nudge At"},"avatar_refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Avatar Refreshed At"},"borrowed_fb_page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Borrowed Fb Page Id"}},"type":"object","required":["business_id","type","username","profile_user_id"],"title":"IntegrationRecord","description":"Integration record model."},"IntegrationResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Integration ID"},"business_id":{"type":"string","title":"Business Id","description":"Business this integration belongs to"},"platform":{"type":"string","title":"Platform","description":"Platform type (facebook, instagram, twitter, etc.)"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"Connected account username"},"profile_picture":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Picture","description":"Profile picture URL, if available"},"selected_page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Page Id","description":"Selected page/board/channel ID (FB Page, Pinterest board, YouTube channel, etc.)"},"selected_page_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Page Name","description":"Selected page/board/channel display name"},"status":{"type":"string","title":"Status","description":"Integration status: VALID, INVALID, etc."},"invalid_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invalid Reason","description":"Why the integration is invalid (if status != VALID)"},"is_reconnect_fixable":{"type":"boolean","title":"Is Reconnect Fixable","description":"True when this integration is dead in a way the user can fix by reconnecting (an expired/revoked token or missing scope). False for a healthy connection, or one down for a content/rate reason a reconnect won't fix.","default":false},"reconnect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reconnect Url","description":"Where the user reconnects this account, when is_reconnect_fixable is true. Null otherwise."}},"type":"object","required":["id","business_id","platform","status"],"title":"IntegrationResponse"},"IntegrationStatus":{"type":"string","title":"IntegrationStatus","description":"Integration status enum.","x-extensible-enum":["valid","invalid","pending"]},"InvoiceSummary":{"properties":{"id":{"type":"string","title":"Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"amount_due":{"type":"string","title":"Amount Due","description":"Formatted as $X.XX"},"amount_paid":{"type":"string","title":"Amount Paid"},"amount_remaining":{"type":"string","title":"Amount Remaining"},"subtotal":{"type":"string","title":"Subtotal"},"tax":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tax"},"total":{"type":"string","title":"Total"},"created_at":{"type":"string","title":"Created At"},"period_start":{"type":"string","title":"Period Start"},"period_end":{"type":"string","title":"Period End"},"hosted_invoice_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hosted Invoice Url","description":"Link to view invoice online"},"invoice_pdf":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Pdf","description":"Direct PDF download link"},"line_items":{"items":{"$ref":"#/components/schemas/LineItemInfo"},"type":"array","title":"Line Items"},"attempt_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Attempt Count"},"next_payment_attempt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Payment Attempt"}},"type":"object","required":["id","status","amount_due","amount_paid","amount_remaining","subtotal","tax","total","created_at","period_start","period_end","hosted_invoice_url","invoice_pdf","line_items","attempt_count","next_payment_attempt"],"title":"InvoiceSummary","description":"A single invoice."},"ItemError":{"properties":{"status_code":{"type":"integer","title":"Status Code","description":"The HTTP status the singular call would have returned."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Stable error code, when the error has one."},"message":{"type":"string","title":"Message","description":"What went wrong with this item, in plain words."}},"type":"object","required":["status_code","message"],"title":"ItemError"},"ItemResult":{"properties":{"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Index","description":"Position of the item in your request (list calls only)."},"post_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Id","description":"The post this result is about."},"ok":{"type":"boolean","title":"Ok"},"revision_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revision Id","description":"Pass to revert_revisions to undo."},"post":{"anyOf":[{"$ref":"#/components/schemas/PostBrief"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ItemError"},{"type":"null"}]}},"type":"object","required":["ok"],"title":"ItemResult"},"JobStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"ID to poll for status"},"status":{"type":"string","title":"Status","description":"Current job status","x-extensible-enum":["pending","completed","failed"]},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/PostResult"},"type":"array"},{"type":"null"}],"title":"Data","description":"Generated posts (when status=completed)"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message (when status=failed)"}},"type":"object","required":["job_id","status"],"title":"JobStatusResponse"},"LangGraphRunWebhook":{"properties":{"status":{"type":"string","title":"Status"}},"additionalProperties":true,"type":"object","required":["status"],"title":"LangGraphRunWebhook","description":"The run object LangGraph posts when a background run ends.\n\nOnly `status` is read. The rest of LangGraph's payload is accepted and\nignored, so a new field on their side never breaks the webhook."},"LangSmithSessionWebhook":{"properties":{"runs":{"items":{"$ref":"#/components/schemas/WebhookRun"},"type":"array","title":"Runs"},"thread_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thread Id"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"extra":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra"}},"type":"object","title":"LangSmithSessionWebhook","description":"The part of LangSmith's payload we need.\n\nThe top-level `thread_id` / `metadata` / `extra` fields are not part of a real\ndelivery — they exist so the endpoint can be driven by hand (and by tests) with a\none-line body instead of a faked batch."},"LeaderboardResponse":{"properties":{"org_id":{"type":"string","title":"Org Id"},"period":{"additionalProperties":{"type":"string"},"type":"object","title":"Period"},"fetched_at":{"type":"string","title":"Fetched At"},"errors":{"items":{"$ref":"#/components/schemas/SyncError"},"type":"array","title":"Errors"},"summary":{"$ref":"#/components/schemas/LeaderboardSummary"},"groups":{"items":{"$ref":"#/components/schemas/GroupStats"},"type":"array","title":"Groups"},"previous_period":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Previous Period"},"period_progress":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Period Progress"}},"type":"object","required":["org_id","period","fetched_at"],"title":"LeaderboardResponse"},"LeaderboardSummary":{"properties":{"active_reps":{"type":"integer","title":"Active Reps","default":0},"total_posts":{"type":"integer","title":"Total Posts","default":0},"total_views":{"type":"integer","title":"Total Views","default":0},"total_engagement":{"type":"integer","title":"Total Engagement","default":0}},"type":"object","title":"LeaderboardSummary"},"LineComponent":{"properties":{"type":{"type":"string","const":"line","title":"Type","default":"line"},"id":{"type":"string","title":"Id"},"x":{"type":"number","title":"X"},"y":{"type":"number","title":"Y"},"width":{"type":"number","title":"Width"},"height":{"type":"number","title":"Height"},"name":{"type":"string","title":"Name"},"filters":{"additionalProperties":true,"type":"object","title":"Filters","default":{}},"color":{"type":"string","title":"Color","default":"black"},"rotation":{"type":"number","title":"Rotation","default":0},"dash":{"items":{"type":"integer"},"type":"array","title":"Dash"},"startHead":{"type":"string","enum":["","arrow","triangle","circle","square","bar"],"title":"Starthead","default":""},"endHead":{"type":"string","enum":["","arrow","triangle","circle","square","bar"],"title":"Endhead","default":""},"selectable":{"type":"boolean","title":"Selectable","default":true},"alwaysOnTop":{"type":"boolean","title":"Alwaysontop","default":false},"showInExport":{"type":"boolean","title":"Showinexport","default":true},"draggable":{"type":"boolean","title":"Draggable","default":true},"contentEditable":{"type":"boolean","title":"Contenteditable","default":true},"removable":{"type":"boolean","title":"Removable","default":true},"resizable":{"type":"boolean","title":"Resizable","default":true},"styleEditable":{"type":"boolean","title":"Styleeditable","default":true},"custom":{"$ref":"#/components/schemas/LineMeta"},"animations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Animations","default":[]}},"type":"object","required":["x","y","width","height","name"],"title":"LineComponent"},"LineItemInfo":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"amount_cents":{"type":"integer","title":"Amount Cents"},"quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quantity"}},"type":"object","required":["description","amount_cents","quantity"],"title":"LineItemInfo","description":"A single charge line item."},"LineMeta":{"properties":{"colorType":{"$ref":"#/components/schemas/ColorType","default":"AUTO"}},"type":"object","title":"LineMeta"},"LintDesignResponse":{"properties":{"design_id":{"type":"string","title":"Design Id"},"lint_issues":{"items":{"$ref":"#/components/schemas/LintIssue"},"type":"array","title":"Lint Issues"}},"type":"object","required":["design_id"],"title":"LintDesignResponse","description":"Lint-only result — no mutations."},"LintIssue":{"properties":{"severity":{"type":"string","title":"Severity","description":"'error' or 'warn'"},"rule":{"type":"string","title":"Rule"},"message":{"type":"string","title":"Message"},"recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommendation","description":"Suggested fix for the issue"},"template_only":{"type":"boolean","title":"Template Only","description":"Rule only applies to templates, not rendered designs","default":false}},"type":"object","required":["severity","rule","message"],"title":"LintIssue","description":"A single lint finding."},"ListVoicesResponse":{"properties":{"voices":{"items":{"$ref":"#/components/schemas/Voice"},"type":"array","title":"Voices","description":"List of available voices"}},"type":"object","required":["voices"],"title":"ListVoicesResponse","description":"Response for listing voices.","examples":[{"voices":[]}]},"LlmSettingsRequest":{"properties":{"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key","description":"OpenRouter API key. Omit to keep existing key and only update model."},"model":{"type":"string","title":"Model","description":"Model ID (e.g. 'openai/gpt-6-luna', 'openai/gpt-5.6-luna')","default":"google/gemini-2.5-flash-lite"}},"type":"object","title":"LlmSettingsRequest"},"LlmSettingsResponse":{"properties":{"has_key":{"type":"boolean","title":"Has Key","description":"Whether a BYOK key is set"},"masked_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Masked Key","description":"Masked API key (last 4 chars)"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"Selected model ID"}},"type":"object","required":["has_key","masked_key","model"],"title":"LlmSettingsResponse"},"LoadSkillRequest":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","description":"The skill name (slash command) to load. Use hyphens, not underscores."}},"type":"object","required":["name"],"title":"LoadSkillRequest","description":"Request to load a saved skill's instructions into context."},"LoadSkillResponse":{"properties":{"skill_run_id":{"type":"string","title":"Skill Run Id","description":"ID of the skill_runs row recorded for this load (empty if it could not be recorded)."},"skill":{"$ref":"#/components/schemas/SkillResponse","description":"The resolved skill, including its instructions."}},"type":"object","required":["skill_run_id","skill"],"title":"LoadSkillResponse","description":"A loaded skill: the resolved skill plus the run id we recorded."},"LogTokenUsageRequest":{"properties":{"thread_id":{"type":"string","title":"Thread Id","description":"LangGraph thread ID"},"business_id":{"type":"string","title":"Business Id","description":"Business ID"},"user_id":{"type":"string","title":"User Id","description":"User ID (for audit trail)"},"model":{"type":"string","title":"Model","description":"Model identifier (e.g., 'gpt-5.2)"},"input_tokens":{"type":"integer","minimum":0.0,"title":"Input Tokens","description":"Number of input tokens"},"output_tokens":{"type":"integer","minimum":0.0,"title":"Output Tokens","description":"Number of output tokens"},"total_tokens":{"type":"integer","minimum":0.0,"title":"Total Tokens","description":"Total tokens (input + output)"},"cache_read_tokens":{"type":"integer","minimum":0.0,"title":"Cache Read Tokens","description":"Number of cached input tokens read","default":0},"run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id","description":"LangGraph run ID (optional)"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id","description":"Message ID (optional)"}},"type":"object","required":["thread_id","business_id","user_id","model","input_tokens","output_tokens","total_tokens"],"title":"LogTokenUsageRequest","description":"Request to log token usage for a conversation."},"LogTokenUsageResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Status message (e.g., 'metered')"},"credits_charged":{"type":"number","title":"Credits Charged","description":"Always 0 — chat is free. Kept so the marky-llm client (a separate deploy) keeps parsing this response."},"estimated_cost_credits":{"type":"number","title":"Estimated Cost Credits","description":"What this turn WOULD have cost at the rate table, in credits. Nobody is billed it. This is the COGS number for deciding whether free chat stays affordable.","default":0}},"type":"object","required":["status","credits_charged"],"title":"LogTokenUsageResponse","description":"Response from token usage logging."},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"User email"},"password":{"type":"string","title":"Password","description":"User password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"LogoSourceSize":{"properties":{"width":{"type":"integer","title":"Width","description":"Width in px of the logo file you sent"},"height":{"type":"integer","title":"Height","description":"Height in px of the logo file you sent"}},"type":"object","required":["width","height"],"title":"LogoSourceSize","description":"The width and height of a logo file as it was given to us, before squaring."},"MarkAllReadRequest":{"properties":{"business_id":{"type":"string","title":"Business Id"},"item_ids":{"items":{"type":"string"},"type":"array","title":"Item Ids"}},"type":"object","required":["business_id","item_ids"],"title":"MarkAllReadRequest"},"MarkIntegrationInvalidRequest":{"properties":{"checked_access_token":{"type":"string","title":"Checked Access Token","description":"The access token that was live-checked and found expired"},"reason":{"type":"string","title":"Reason","description":"Human-readable reason to store on the row"}},"type":"object","required":["checked_access_token","reason"],"title":"MarkIntegrationInvalidRequest","description":"Request body for reporting a live-detected expired token."},"MarketingAttribution":{"properties":{"event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Id","description":"Client-minted UUID for Meta CAPI dedup"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"utm_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Content"},"utm_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Term"},"fbclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbclid"},"gclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gclid","description":"Google Ads click ID appended to the landing URL"},"fbp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbp","description":"Meta browser ID cookie (_fbp)"},"fbc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbc","description":"Meta click ID cookie (_fbc)"},"initial_referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initial Referrer","description":"First-touch referrer captured on the landing page"},"initial_channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Initial Channel","description":"First-touch channel captured on the landing page"}},"type":"object","title":"MarketingAttribution","description":"Optional marketing attribution payload passed alongside signup requests.\n\nThe frontend mints `event_id` (UUID) on form submit, passes it to the browser\npixel as fbq's `eventID`, and includes it here so the backend CAPI call\ndedupes against the same event. See:\nbusiness/product/features/1planning/meta-capi-server-side-tracking/proposal.md"},"MaskImageResponse":{"properties":{"image_url":{"type":"string","title":"Image Url","description":"S3 URL of image with mask applied"}},"type":"object","required":["image_url"],"title":"MaskImageResponse","description":"Response for mask application.","examples":[{"image_url":"https://s3.amazonaws.com/bucket/masked-image.png"}]},"MaxFirstArm":{"type":"string","enum":["control","test","not-in-experiment"]},"MaxFirstArmResponse":{"properties":{"arm":{"$ref":"#/components/schemas/MaxFirstArm"}},"type":"object","required":["arm"],"title":"MaxFirstArmResponse"},"MaxFlags":{"properties":{"flags":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Flags","description":"Flag key -> on/off. Always carries every key in MAX_FLAG_KEYS."}},"type":"object","required":["flags"],"title":"MaxFlags","description":"Every Max flag for one workspace, each answered explicitly."},"MaxTurnAckRequest":{"properties":{"run_id":{"type":"string","minLength":1,"title":"Run Id","description":"LangGraph run id this tab streamed to its end: a finished reply, or a question the run stopped on."}},"type":"object","required":["run_id"],"title":"MaxTurnAckRequest"},"MaxTurnCompleteRequest":{"properties":{"user_id":{"type":"string","minLength":1,"title":"User Id","description":"The user who sent the message Max answered."},"thread_id":{"type":"string","minLength":1,"title":"Thread Id","description":"LangGraph thread id of the conversation."},"business_id":{"type":"string","minLength":1,"title":"Business Id","description":"Workspace the conversation belongs to."},"run_id":{"type":"string","minLength":1,"title":"Run Id","description":"LangGraph run id of the turn that finished."},"reply_text":{"type":"string","maxLength":20000,"title":"Reply Text","description":"Max's final reply, raw. Trimmed to a short preview here.","default":""}},"type":"object","required":["user_id","thread_id","business_id","run_id"],"title":"MaxTurnCompleteRequest"},"MaxTurnNeedsAnswerRequest":{"properties":{"user_id":{"type":"string","minLength":1,"title":"User Id","description":"The user who sent the message Max is working on."},"thread_id":{"type":"string","minLength":1,"title":"Thread Id","description":"LangGraph thread id of the conversation."},"business_id":{"type":"string","minLength":1,"title":"Business Id","description":"Workspace the conversation belongs to."},"run_id":{"type":"string","minLength":1,"title":"Run Id","description":"LangGraph run id of the turn that stopped on a question."},"question_text":{"type":"string","maxLength":20000,"title":"Question Text","description":"What Max asked, raw. Trimmed to a short preview here. Empty when there is nothing to quote (an approval card); the push then uses a generic line.","default":""}},"type":"object","required":["user_id","thread_id","business_id","run_id"],"title":"MaxTurnNeedsAnswerRequest"},"MediaResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Media ID"},"business_id":{"type":"string","title":"Business Id","description":"Business this media belongs to"},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text","description":"Alt text description"},"original_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Url","description":"Media URL"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type","description":"Media type: image, video, or audio"},"width":{"anyOf":[{"type":"integer","format":"int32"},{"type":"null"}],"title":"Width","description":"Width in pixels"},"height":{"anyOf":[{"type":"integer","format":"int32"},{"type":"null"}],"title":"Height","description":"Height in pixels"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Media origin (e.g. upload, unsplash)"},"created_at":{"type":"string","title":"Created At","description":"When the media was uploaded"}},"type":"object","required":["id","business_id","created_at"],"title":"MediaResponse"},"MediaSearchHit":{"properties":{"id":{"type":"string","title":"Id","description":"Media ID"},"business_id":{"type":"string","title":"Business Id","description":"Business this media belongs to"},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text","description":"Alt text description"},"original_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Url","description":"Media URL"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type","description":"Media type: image, video, or audio"},"width":{"anyOf":[{"type":"integer","format":"int32"},{"type":"null"}],"title":"Width","description":"Width in pixels"},"height":{"anyOf":[{"type":"integer","format":"int32"},{"type":"null"}],"title":"Height","description":"Height in pixels"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Media origin (e.g. upload, unsplash)"},"created_at":{"type":"string","title":"Created At","description":"When the media was uploaded"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At","description":"When this media was last put on a post of this business (deleted posts don't count). Null means it has never been posted."},"low_res":{"type":"boolean","title":"Low Res","description":"True when the longest side is under 1080px, so it may look soft on Instagram or Facebook. False when the size is unknown.","default":false}},"type":"object","required":["id","business_id","created_at"],"title":"MediaSearchHit","description":"One `search_media_library` result: a media item plus how fresh it is.\n\nExtends MediaResponse with new fields only, so a client that reads the\nplain media shape keeps working."},"MediaSearchPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MediaSearchHit"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."},"unused_count":{"type":"integer","title":"Unused Count","description":"How many photos in the whole library the default search would offer: not posted recently, not AI-generated, and at least 600px on the long side. 0 means every usable photo was posted recently, so the results are repeats (check each item's last_used_at)."}},"type":"object","required":["items","unused_count"],"title":"MediaSearchPage","description":"The search results plus how many unused photos the library holds.\n\nKeeps the standard Page shape (`items` + `next`) and only ADDS\n`unused_count`, the same way QueuedPostsPage adds `summary`."},"MediaUploadCreateRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"The business whose library the file will land in. Get it from `list_businesses`."},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename","description":"Original filename, e.g. 'photo.jpg'. Helps detect videos by extension."},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","description":"MIME type, e.g. 'image/jpeg' or 'video/mp4'. The PUT request's Content-Type header takes precedence."},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text","description":"Alt text stored on the uploaded media."},"source":{"anyOf":[{"type":"string","const":"max_video"},{"type":"null"}],"title":"Source","description":"Set only by Marky's own agent for media it generated, so the library can tell it apart from the business's uploads. Leave unset for a real upload."}},"type":"object","required":["business_id"],"title":"MediaUploadCreateRequest"},"MediaUploadCreateResponse":{"properties":{"upload_id":{"type":"string","title":"Upload Id","description":"Unique id for this upload."},"upload_url":{"type":"string","title":"Upload Url","description":"PUT the raw file bytes here. Valid for expires_in seconds."},"expires_in":{"type":"integer","title":"Expires In","description":"Seconds until the upload_url stops working."},"max_bytes":{"type":"integer","title":"Max Bytes","description":"Size cap: 20 MB for images, 500 MB for video."},"instructions":{"type":"string","title":"Instructions","description":"Copy-paste curl command that performs the upload and prints the created media as JSON."}},"type":"object","required":["upload_id","upload_url","expires_in","max_bytes","instructions"],"title":"MediaUploadCreateResponse"},"MediaUploadFromReferenceRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"UUID of the business to upload the media into. Get it from `list_businesses`. Must belong to the API key's org."},"file":{"$ref":"#/components/schemas/HostFileReference","description":"Host file reference. ChatGPT fills this automatically from the user's or generated file; Marky fetches its `download_url` server-side."},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text","description":"Optional hint about the media: an address, a name, anything the picture can't show. Stored as `source_alt_text`; `alt_text` is written by looking at the image itself shortly after upload."}},"additionalProperties":false,"type":"object","required":["business_id","file"],"title":"MediaUploadFromReferenceRequest","description":"JSON body for the ChatGPT-native media upload (fetch by host file reference).\n\nChatGPT fills `file` automatically from the user's attachment or a generated\nfile, and Marky fetches the bytes server-side — no outbound upload from\nChatGPT's code sandbox, which hosted interpreters block (so the presigned-PUT\nflow of `create_media_upload` fails there). See `upload_media_from_reference`."},"MediaUploadFromUrlRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"UUID of the business to upload the media into. Get it from `list_businesses`. Must belong to the API key's org."},"url":{"type":"string","title":"Url","description":"Public http(s) URL of the image or video to fetch. Private and internal addresses are rejected. Max size: 20 MB for images, 500 MB for video."},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename","description":"Optional original filename (e.g. `clip.mp4`). Helps detect video when the URL path and server content type don't make it obvious."},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text","description":"Optional hint about the media: an address, a name, anything the picture can't show. Stored as `source_alt_text`; `alt_text` is written by looking at the image itself shortly after upload."}},"additionalProperties":false,"type":"object","required":["business_id","url"],"title":"MediaUploadFromUrlRequest","description":"JSON body for the fetch-by-URL media upload (the agent-friendly big-file upload).\n\nBase64 over MCP tops out fast — a 24 MB video is ~32 MB of JSON in a single\ntool call, which most agent runtimes refuse. An agent whose media is already\nreachable over http(s) sends the URL instead and we fetch it server-side."},"MediaUploadResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Media ID"},"business_id":{"type":"string","title":"Business Id","description":"Business this media belongs to"},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text","description":"Alt text description"},"original_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Url","description":"Media URL"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type","description":"Media type: image, video, or audio"},"width":{"anyOf":[{"type":"integer","format":"int32"},{"type":"null"}],"title":"Width","description":"Width in pixels"},"height":{"anyOf":[{"type":"integer","format":"int32"},{"type":"null"}],"title":"Height","description":"Height in pixels"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Media origin (e.g. upload, unsplash)"},"created_at":{"type":"string","title":"Created At","description":"When the media was uploaded"},"source_alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Alt Text","description":"The alt_text you sent, kept as a hint. `alt_text` is written a few seconds after upload by looking at the image itself, so it is empty in this response. Search results show that description."},"warnings":{"items":{"$ref":"#/components/schemas/FieldWarning"},"type":"array","title":"Warnings","description":"Non-blocking notes about this media, empty when there is nothing to say. `low_resolution` means the long edge is under 1080px, so it will look soft on most feeds; tell the user and prefer a larger copy.","readOnly":true}},"type":"object","required":["id","business_id","created_at","warnings"],"title":"MediaUploadResponse","description":"What an upload route returns: the new media, plus what the caller should know.\n\nA subclass rather than new fields on MediaResponse, because MediaResponse is\nalso every library READ. `source_alt_text` and `warnings` only mean something\nat the moment of upload, when the agent can still act on them."},"MediaUrlRefreshItem":{"properties":{"integration_id":{"type":"string","title":"Integration Id","description":"Integration UUID owning the post."},"external_post_id":{"type":"string","title":"External Post Id","description":"Platform post ID, e.g. IG media id."}},"type":"object","required":["integration_id","external_post_id"],"title":"MediaUrlRefreshItem"},"MediaUrlRefreshResult":{"properties":{"external_post_id":{"type":"string","title":"External Post Id","description":"Echo of the input post id."},"media_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Url","description":"Freshly-signed media URL. None when the platform has no re-fetchable URL (TikTok needs yt-dlp via /social-video/resolve), when the post has no media (image/carousel without an mp4), or when the refresh failed — see `error`."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Failure reason, truncated to 200 chars. None on success."}},"type":"object","required":["external_post_id"],"title":"MediaUrlRefreshResult"},"MemorySnapshot":{"properties":{"collected_at":{"type":"string","format":"date-time","title":"Collected At"},"instance_id":{"type":"string","title":"Instance Id"},"rss_mb":{"type":"number","title":"Rss Mb"},"current_traced_mb":{"type":"number","title":"Current Traced Mb"},"peak_traced_mb":{"type":"number","title":"Peak Traced Mb"},"traced_total_mb":{"type":"number","title":"Traced Total Mb"},"tracemalloc_active":{"type":"boolean","title":"Tracemalloc Active"},"top":{"items":{"$ref":"#/components/schemas/MemoryStat"},"type":"array","title":"Top"}},"type":"object","required":["collected_at","instance_id","rss_mb","current_traced_mb","peak_traced_mb","traced_total_mb","tracemalloc_active","top"],"title":"MemorySnapshot","description":"Aggregate memory usage details."},"MemoryStat":{"properties":{"stack":{"items":{"type":"string"},"type":"array","title":"Stack"},"size_kb":{"type":"number","title":"Size Kb"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["stack","size_kb","count"],"title":"MemoryStat","description":"Single allocation aggregate."},"MetricDescriptor":{"properties":{"platform":{"type":"string","title":"Platform"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"normalized_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Slug"},"metric_type":{"type":"string","title":"Metric Type"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"agg":{"type":"string","enum":["point","sum","avg"],"title":"Agg"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["platform","slug","name","metric_type","agg"],"title":"MetricDescriptor"},"MetricTimeseries":{"properties":{"name":{"type":"string","title":"Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period"},"metric_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Kind","description":"What this metric actually counts, so metrics can be compared safely: 'content_reach', 'impressions', 'profile_visits', 'followers', or 'engagement'. Two metrics with DIFFERENT kinds measure different things and must not be compared (e.g. Facebook 'profile_visits' is not Instagram 'content_reach'). None = unknown."},"values":{"items":{"$ref":"#/components/schemas/MetricValue"},"type":"array","title":"Values","default":[]}},"type":"object","required":["name"],"title":"MetricTimeseries","description":"A metric with time-series data points."},"MetricTotals":{"properties":{"post_count":{"type":"integer","title":"Post Count","description":"Number of posts in the period"},"reach":{"type":"integer","title":"Reach","description":"Total reach across all posts"},"likes":{"type":"integer","title":"Likes","description":"Total likes"},"comments":{"type":"integer","title":"Comments","description":"Total comments"},"clicks":{"type":"integer","title":"Clicks","description":"Total clicks"},"engagement_rate":{"type":"number","title":"Engagement Rate","description":"Average engagement rate (decimal)"}},"type":"object","required":["post_count","reach","likes","comments","clicks","engagement_rate"],"title":"MetricTotals","description":"Aggregate metric totals for a period."},"MetricValue":{"properties":{"value":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Value"},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time"}},"type":"object","title":"MetricValue","description":"A single metric value with optional time range."},"MilestoneCheckResponse":{"properties":{"status":{"type":"string","title":"Status"},"emails_sent":{"type":"integer","title":"Emails Sent"}},"type":"object","required":["status","emails_sent"],"title":"MilestoneCheckResponse"},"Moment":{"properties":{"name":{"type":"string","title":"Name"},"name_en":{"type":"string","title":"Name En"},"date":{"type":"string","format":"date","title":"Date"},"type":{"type":"string","enum":["public","fun","event"],"title":"Type"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"days_until":{"type":"integer","title":"Days Until"},"estimated":{"type":"boolean","title":"Estimated","default":false},"aliases":{"items":{"type":"string"},"type":"array","title":"Aliases"},"covered_post_ids":{"items":{"type":"string"},"type":"array","title":"Covered Post Ids"},"weekday":{"type":"string","title":"Weekday","description":"English weekday name, e.g. \"Wednesday\": Max quotes it, never computes it.","readOnly":true}},"type":"object","required":["name","name_en","date","type","country","days_until","weekday"],"title":"Moment","description":"One dated moment a business might post about."},"MoveFileRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID"},"source":{"type":"string","title":"Source","description":"Source file path (must start with '/')"},"target":{"type":"string","title":"Target","description":"Target file path (must start with '/')"}},"type":"object","required":["business_id","source","target"],"title":"MoveFileRequest","description":"Request to move or rename a file/folder.","examples":[{"business_id":"biz-123","source":"/documents/old","target":"/documents/new"}]},"MoveFileResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the operation succeeded"},"message":{"type":"string","title":"Message","description":"Success or error message"}},"type":"object","required":["success","message"],"title":"MoveFileResponse","description":"Response from file move operation."},"MoveToOrgRequest":{"properties":{"target_org_id":{"type":"string","title":"Target Org Id","description":"Organization ID to move the workspace to"}},"type":"object","required":["target_org_id"],"title":"MoveToOrgRequest"},"MultiAccountCapability":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"True when connecting an already-connected platform again adds a new account. False when it replaces the existing one in place."}},"type":"object","required":["enabled"],"title":"MultiAccountCapability","description":"Whether this workspace may connect a SECOND account of one platform."},"NewCategoryRequest":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","description":"Category name. Reused if it already exists."},"color":{"type":"string","title":"Color","description":"Hex color shown in the app.","default":"#6366F1"},"description":{"type":"string","title":"Description","description":"Optional notes.","default":""}},"additionalProperties":false,"type":"object","required":["name"],"title":"NewCategoryRequest"},"NewComponent":{"properties":{"type":{"type":"string","title":"Type","description":"Component type: 'text', 'figure', 'image'"},"fields":{"additionalProperties":true,"type":"object","title":"Fields","description":"All fields for the component (camelCase). Must include x, y, width, height."}},"type":"object","required":["type","fields"],"title":"NewComponent","description":"A new component to add to the design."},"NewsArticle":{"properties":{"title":{"type":"string","title":"Title"},"url":{"type":"string","title":"Url"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"published":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published"}},"type":"object","required":["title","url"],"title":"NewsArticle"},"NormalizedRect":{"properties":{"center_x":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Center X","description":"X center position (0-1)"},"center_y":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Center Y","description":"Y center position (0-1)"},"scale":{"type":"number","minimum":0.1,"title":"Scale","description":"Scale factor (1 = full frame, >1 = zoom)"}},"type":"object","required":["center_x","center_y","scale"],"title":"NormalizedRect","description":"Normalized rectangle for zoom/pan positioning."},"NotificationPreferences":{"properties":{"publish_failed":{"$ref":"#/components/schemas/EventChannels"},"publish_succeeded":{"$ref":"#/components/schemas/EventChannels"},"low_scheduled":{"$ref":"#/components/schemas/EventChannels"},"low_scheduled_thresholds":{"items":{"type":"integer"},"type":"array","title":"Low Scheduled Thresholds","description":"Scheduled-post counts that trigger the low-scheduled notification. Trimmed from [5, 3, 1, 0] on 2026-07-03 to match the frontend UI default and halve nudge volume; power users can add more thresholds from the preferences page."},"streak_milestone":{"$ref":"#/components/schemas/EventChannels"},"post_highlight":{"$ref":"#/components/schemas/EventChannels"},"comeback":{"$ref":"#/components/schemas/EventChannels"},"onboarding":{"$ref":"#/components/schemas/EventChannels"},"trial_recovery":{"$ref":"#/components/schemas/EventChannels"},"trial_reminders":{"$ref":"#/components/schemas/EventChannels"},"review_ask":{"$ref":"#/components/schemas/EventChannels"},"churn_feedback":{"$ref":"#/components/schemas/EventChannels"},"anniversary":{"$ref":"#/components/schemas/EventChannels"},"post_approved":{"$ref":"#/components/schemas/EventChannels"},"changes_requested":{"$ref":"#/components/schemas/EventChannels"},"new_comment":{"$ref":"#/components/schemas/EventChannels"},"post_stats_digest":{"$ref":"#/components/schemas/EventChannels"},"stats_digest_cadence":{"type":"string","enum":["weekly","monthly"],"title":"Stats Digest Cadence","default":"weekly"},"autopilot":{"$ref":"#/components/schemas/EventChannels"},"payment_receipts":{"$ref":"#/components/schemas/EventChannels"},"max_reply":{"$ref":"#/components/schemas/EventChannels"},"muted_workspace_ids":{"items":{"type":"string"},"type":"array","title":"Muted Workspace Ids"}},"type":"object","title":"NotificationPreferences","description":"A user's complete notifications preferences.\n\nDefaults match the legacy behavior so a fresh user gets the same emails\nand pushes they'd have gotten under the old shape."},"OAuthCallbackRequest":{"properties":{"code":{"type":"string","title":"Code","description":"Authorization code from Canva OAuth redirect"},"code_verifier":{"type":"string","title":"Code Verifier","description":"PKCE code verifier generated by the frontend"},"redirect_uri":{"type":"string","title":"Redirect Uri","description":"Redirect URI used in the OAuth request"},"business_id":{"type":"string","title":"Business Id","description":"Business to associate the Canva connection with"}},"type":"object","required":["code","code_verifier","redirect_uri","business_id"],"title":"OAuthCallbackRequest"},"ObjectCount":{"properties":{"type_name":{"type":"string","title":"Type Name"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["type_name","count"],"title":"ObjectCount","description":"Aggregate Python-object stats for a single type."},"ObjectSnapshot":{"properties":{"collected_at":{"type":"string","format":"date-time","title":"Collected At"},"instance_id":{"type":"string","title":"Instance Id"},"rss_mb":{"type":"number","title":"Rss Mb"},"total_objects":{"type":"integer","title":"Total Objects"},"walk_duration_ms":{"type":"number","title":"Walk Duration Ms"},"top":{"items":{"$ref":"#/components/schemas/ObjectCount"},"type":"array","title":"Top"}},"type":"object","required":["collected_at","instance_id","rss_mb","total_objects","walk_duration_ms","top"],"title":"ObjectSnapshot","description":"Top Python object types by live-instance count.\n\nCatches retained collections that tracemalloc misses\n(objects allocated before tracemalloc.start() was called)."},"OgPreviewResponse":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"site_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Name"},"favicon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Favicon"},"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"OgPreviewResponse","description":"Open Graph metadata for a URL."},"OkResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"Always true on success.","default":true}},"type":"object","title":"OkResponse"},"OnboardingGoals":{"properties":{"outcome_goals":{"items":{"type":"string"},"type":"array","title":"Outcome Goals","description":"Why they post: brand_awareness, engagement, loyalty, generate_leads, web_traffic, humanize"},"job_needs":{"items":{"type":"string"},"type":"array","title":"Job Needs","description":"What they value: save_time, stay_consistent, high_quality, compliance, visibility, variety"},"posting_goal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Posting Goal","description":"Desired posting frequency: casual, regular, serious, intense"}},"type":"object","title":"OnboardingGoals","description":"User's stated goals and needs from onboarding, used to contextualize insights."},"OnboardingSummaryRequest":{"properties":{"business_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Name","description":"Business name from scrape"},"business_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Description","description":"Business description from scrape"},"segment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment","description":"Detected business segment"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location","description":"Business location"},"user_type":{"type":"string","title":"User Type","description":"'brand' or 'agency'"},"brand_scale":{"type":"string","title":"Brand Scale","description":"'1', '2-5', or '6+'"},"outcome_goals":{"items":{"type":"string"},"type":"array","title":"Outcome Goals","description":"Selected outcome goals (already humanized)"},"posting_goal":{"type":"string","title":"Posting Goal","description":"Posting frequency goal (already humanized)"},"tool_values":{"items":{"type":"string"},"type":"array","title":"Tool Values","description":"Selected tool values (already humanized)"},"selected_jobs":{"items":{"type":"string"},"type":"array","title":"Selected Jobs","description":"Selected job labels (already humanized)"}},"type":"object","required":["user_type","brand_scale","outcome_goals","posting_goal","tool_values","selected_jobs"],"title":"OnboardingSummaryRequest","description":"Input for generating a personalized onboarding summary."},"OptimizePromptUpdate":{"properties":{"platform":{"type":"string","title":"Platform","description":"The social platform this optimize prompt applies to.","x-extensible-enum":["facebook","instagram","linkedin","twitter","tiktok"]},"new_value":{"type":"string","title":"New Value","description":"The COMPLETE per-platform optimize prompt. Should be a single paragraph describing how to adapt a caption for this platform, based on what works in this business's actual posts on this platform."},"change_summary":{"type":"string","title":"Change Summary","description":"One sentence explaining what was learned about this platform's style."}},"type":"object","required":["platform","new_value","change_summary"],"title":"OptimizePromptUpdate"},"OrgBrandingResponse":{"properties":{"id":{"type":"string","title":"Id"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Color"},"cname":{"anyOf":[{"$ref":"#/components/schemas/CName"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["id","domain","logo_url","primary_color","name"],"title":"OrgBrandingResponse","description":"Organization branding response for the domain update endpoint."},"OverlayAnimation":{"properties":{"in":{"anyOf":[{"$ref":"#/components/schemas/OverlayAnimationIn"},{"type":"null"}]},"out":{"anyOf":[{"$ref":"#/components/schemas/OverlayAnimationOut"},{"type":"null"}]}},"type":"object","title":"OverlayAnimation","description":"Animation settings for overlay."},"OverlayAnimationIn":{"properties":{"type":{"type":"string","enum":["fade","slide_up","scale_in"],"title":"Type"},"duration":{"type":"number","title":"Duration"}},"type":"object","required":["type","duration"],"title":"OverlayAnimationIn","description":"Animation for overlay entrance."},"OverlayAnimationOut":{"properties":{"type":{"type":"string","enum":["fade","slide_down","scale_out"],"title":"Type"},"duration":{"type":"number","title":"Duration"}},"type":"object","required":["type","duration"],"title":"OverlayAnimationOut","description":"Animation for overlay exit."},"OverlayPosition":{"properties":{"anchor":{"type":"string","enum":["top_left","top","top_right","center_left","center","center_right","bottom_left","bottom","bottom_right"],"title":"Anchor"},"offset_x":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Offset X","default":0.0},"offset_y":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Offset Y","default":0.0},"x":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"X"},"y":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Y"}},"type":"object","required":["anchor"],"title":"OverlayPosition","description":"Position for overlay elements.\n\nSupports two formats:\n1. anchor + offset_x/offset_y (pixel offsets)\n2. anchor + x/y (normalized 0-1 coordinates, converted to offsets)"},"PageIdentity":{"properties":{"name":{"type":"string","title":"Name"},"avatar_url":{"type":"string","title":"Avatar Url"}},"type":"object","required":["name","avatar_url"],"title":"PageIdentity"},"PageInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"},"picture_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Picture Url"},"extra_data":{"additionalProperties":true,"type":"object","title":"Extra Data"}},"additionalProperties":false,"type":"object","required":["id","name"],"title":"PageInfo","description":"A page/account returned from OAuth page fetching."},"PageMeta":{"properties":{"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"poster_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Poster Url"},"colorType":{"$ref":"#/components/schemas/ColorType","default":"BACKGROUND"}},"type":"object","title":"PageMeta"},"PageStatsErrorData":{"properties":{"error_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Type"},"error_classification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Classification"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"PageStatsErrorData"},"PageStatsMetric":{"properties":{"name":{"type":"string","title":"Name"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"help_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Help Text"},"data":{"additionalProperties":{"$ref":"#/components/schemas/PageStatsMetricValue"},"type":"object","title":"Data","description":"Date string → metric value"}},"type":"object","required":["name","title","description","data"],"title":"PageStatsMetric","description":"Page stats metric with timeseries data."},"PageStatsMetricValue":{"properties":{"total":{"type":"number","title":"Total"}},"type":"object","required":["total"],"title":"PageStatsMetricValue"},"PageStatsResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PageStatsMetric"},"type":"array","title":"Data","default":[]},"error":{"anyOf":[{"$ref":"#/components/schemas/PageStatsErrorData"},{"type":"null"}]}},"type":"object","title":"PageStatsResponse","description":"Response for page-level analytics."},"PageViewRequest":{"properties":{"event_id":{"type":"string","title":"Event Id","description":"UUID matching the client pixel's eventID for dedup"},"event_source_url":{"type":"string","title":"Event Source Url","description":"The page URL the user is viewing"},"fbp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbp","description":"Meta browser cookie (_fbp)"},"fbc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbc","description":"Meta click cookie (_fbc)"}},"type":"object","required":["event_id","event_source_url"],"title":"PageViewRequest","description":"Mirror of the client-side fbq('track', 'PageView') call."},"Page_ApiKeyListItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ApiKeyListItem"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[ApiKeyListItem]"},"Page_BusinessSummaryResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BusinessSummaryResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[BusinessSummaryResponse]"},"Page_CategoryResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CategoryResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[CategoryResponse]"},"Page_FileResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FileResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[FileResponse]"},"Page_FolderResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FolderResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[FolderResponse]"},"Page_IntegrationResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/IntegrationResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[IntegrationResponse]"},"Page_MediaResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MediaResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[MediaResponse]"},"Page_PostCommentResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PostCommentResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[PostCommentResponse]"},"Page_PostIdeaResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PostIdeaResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[PostIdeaResponse]"},"Page_PostResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PostResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[PostResponse]"},"Page_PostSummaryResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PostSummaryResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[PostSummaryResponse]"},"Page_RecipeResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RecipeResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[RecipeResponse]"},"Page_TemplateSummary_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TemplateSummary"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[TemplateSummary]"},"Page_TopicResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TopicResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[TopicResponse]"},"Page_WebhookDeliveryResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/WebhookDeliveryResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[WebhookDeliveryResponse]"},"Page_WebhookResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/WebhookResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."}},"type":"object","required":["items"],"title":"Page[WebhookResponse]"},"PaginatedPostStats":{"properties":{"posts":{"items":{"$ref":"#/components/schemas/src__vendors__socials__analytics_models__PostWithStats"},"type":"array","title":"Posts"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count"},"unavailable_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unavailable Reason"}},"type":"object","required":["posts"],"title":"PaginatedPostStats","description":"Paginated response for post stats.\n\nUsed for both API responses and internal service communication."},"Palette":{"properties":{"name":{"type":"string","title":"Name","description":"Label for this palette","default":"My Palette"},"colors":{"items":{"type":"string"},"type":"array","title":"Colors","description":"Hex color codes in the palette, e.g. ['#0d0c0c', '#FFFFFF', '#121212']."},"text_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Color","description":"Hex color used for body text on designs"},"accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accent Color","description":"Hex accent/brand color"},"background_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Background Color","description":"Hex background color for designs"}},"additionalProperties":false,"type":"object","title":"Palette"},"ParseBriefRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"Natural language description of the post the user wants"},"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"When provided, fills unspecified fields with business defaults"}},"type":"object","required":["prompt"],"title":"ParseBriefRequest"},"PatchDesignRequest":{"properties":{"page_index":{"type":"integer","title":"Page Index","description":"Page index to modify","default":0},"background":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Background","description":"New page background color (hex)"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width","description":"New canvas width (e.g. 1080)"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height","description":"New canvas height (e.g. 1080 for 1:1, 1350 for 4:5)"},"component_updates":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Component Updates","description":"Map of component_id → {field: value} updates. Use camelCase field names."},"remove_component_ids":{"items":{"type":"string"},"type":"array","title":"Remove Component Ids","description":"Component IDs to remove from the page."},"add_components":{"items":{"$ref":"#/components/schemas/NewComponent"},"type":"array","title":"Add Components","description":"New components to add to the page."},"reorder_component_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Reorder Component Ids","description":"Full ordered list of component IDs for z-ordering (first=bottom, last=top). Must include ALL component IDs."}},"type":"object","title":"PatchDesignRequest","description":"Apply patches to a design — background, component updates, add/remove/reorder."},"PatchDesignResponse":{"properties":{"design_id":{"type":"string","title":"Design Id"},"applied":{"type":"integer","title":"Applied"},"lint_issues":{"items":{"$ref":"#/components/schemas/LintIssue"},"type":"array","title":"Lint Issues"},"rendered_urls":{"items":{"type":"string"},"type":"array","title":"Rendered Urls"}},"type":"object","required":["design_id","applied"],"title":"PatchDesignResponse"},"PauseSubscriptionRequest":{"properties":{"org_id":{"type":"string","title":"Org Id"},"days":{"type":"integer","enum":[30,60,90],"title":"Days","description":"How many days to pause billing for (30, 60, or 90).","default":30}},"additionalProperties":false,"type":"object","required":["org_id"],"title":"PauseSubscriptionRequest","description":"Body for the pause save-offer — the org plus how long to pause billing."},"PauseSubscriptionResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"paused_until":{"type":"string","title":"Paused Until"}},"type":"object","required":["paused_until"],"title":"PauseSubscriptionResponse"},"PaymentMethodInfo":{"properties":{"type":{"type":"string","title":"Type","description":"e.g. 'card', 'us_bank_account'"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand","description":"Card brand (visa, mastercard, etc.)"},"last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last4","description":"Last 4 digits"},"exp_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exp Month"},"exp_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exp Year"}},"type":"object","required":["type","brand","last4"],"title":"PaymentMethodInfo","description":"Card or payment method on file."},"PaymentMethodResponse":{"properties":{"has_card":{"type":"boolean","title":"Has Card","description":"True if the org has a card we can charge off-session"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand","description":"Card brand, e.g. 'visa' (None if unknown)"},"last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last4","description":"Last 4 digits of the card (None if unknown)"},"price_per_credit_cents":{"type":"integer","title":"Price Per Credit Cents","description":"What one credit costs, in cents — the same number the charge uses"}},"type":"object","required":["has_card","price_per_credit_cents"],"title":"PaymentMethodResponse","description":"Whether we can charge this org's saved card, and what to call it.","examples":[{"brand":"visa","has_card":true,"last4":"2513","price_per_credit_cents":6}]},"PdfToMdRequest":{"properties":{"pdf_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pdf Base64"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"}},"type":"object","title":"PdfToMdRequest"},"PlanPostsRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business to plan posts for"},"post_count":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Post Count","description":"Number of post briefs to generate","default":3},"topic_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Topic Ids","description":"Override topic selection"},"custom_topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Topic","description":"Custom topic string"},"custom_idea":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Idea","description":"Skip ideation, use this idea for all briefs"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url","description":"Scrape URL for context"},"resource_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Resource Ids","description":"Resource IDs for context"},"creative_formats":{"anyOf":[{"items":{"type":"string","x-extensible-enum":["design","carousel","meme","image","gif","video","ai-image","ai-video"]},"type":"array"},{"type":"null"}],"title":"Creative Formats","description":"Creative format per brief"},"template_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Template Ids","description":"Override template selection"}},"type":"object","required":["business_id"],"title":"PlanPostsRequest"},"PlanningSnapshotResponse":{"properties":{"schedule":{"$ref":"#/components/schemas/SnapshotSchedule"},"queue":{"$ref":"#/components/schemas/SnapshotQueue"},"topics":{"$ref":"#/components/schemas/SnapshotTopics"},"recent_posts":{"$ref":"#/components/schemas/SnapshotRecentPosts"},"media_matches":{"items":{"$ref":"#/components/schemas/SnapshotMediaMatch"},"type":"array","title":"Media Matches","description":"One entry per media query, in the order sent. Empty when no queries were sent."}},"type":"object","required":["schedule","queue","topics","recent_posts","media_matches"],"title":"PlanningSnapshotResponse","description":"Everything a batch plan needs, read in one call."},"Platform":{"type":"string","title":"Platform","description":"Supported social media platforms.","x-extensible-enum":["instagram","facebook","linkedin","twitter","tiktok","youtube","pinterest","bluesky","reddit","threads","snapchat","telegram"]},"PlatformBreakdown":{"properties":{"platform":{"type":"string","title":"Platform","description":"Platform name (Facebook, Instagram, LinkedIn, etc.)"},"post_count":{"type":"integer","title":"Post Count","description":"Number of posts published to this platform"},"total_engagement":{"type":"integer","title":"Total Engagement","description":"Total engagement across posts on this platform"},"is_connected":{"type":"boolean","title":"Is Connected","description":"Whether this platform is currently connected but unused (True if connected)","default":true}},"type":"object","required":["platform","post_count","total_engagement"],"title":"PlatformBreakdown","description":"Post count and engagement by platform."},"PlatformOverrideModel":{"properties":{"platform":{"type":"string","title":"Platform","description":"Platform this override applies to (e.g. instagram, linkedIn, twitter). Case-insensitive.","x-extensible-enum":["facebook","instagram","twitter","linkedIn","linkedInProfile","tiktok","pinterest","googleBusiness","instagramStory","youtube"]},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption","description":"Caption this platform gets instead of the post's caption. Tailor length, hashtag count, and link placement to the platform."},"media_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Urls","description":"Media this platform gets instead of the post's media_urls."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Title, on platforms that have one (Pinterest pin title, YouTube video title)."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link","description":"Destination link, on platforms that support one (e.g. Pinterest, Google Business)."},"first_comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Comment","description":"Comment auto-posted right after publishing on this platform — the usual home for hashtags and links on Instagram/LinkedIn."}},"additionalProperties":false,"type":"object","required":["platform"],"title":"PlatformOverrideModel","description":"Per-platform variant of a post's content.\n\nAt publish time each platform uses its override field when set and falls\nback to the post's own field when not. Overrides for platforms the post\ndoesn't publish to are inert."},"PlatformPostStats":{"properties":{"platform":{"type":"string","title":"Platform","description":"Platform identifier"},"external_post_id":{"type":"string","title":"External Post Id","description":"Provider's post ID"},"stats":{"$ref":"#/components/schemas/PostStats","description":"Normalized post metrics (likes, comments, reach, etc.)"}},"type":"object","required":["platform","external_post_id","stats"],"title":"PlatformPostStats"},"PlatformPostStatsError":{"properties":{"platform":{"type":"string","title":"Platform"},"error":{"type":"string","title":"Error","description":"Why stats could not be fetched for this platform"}},"type":"object","required":["platform","error"],"title":"PlatformPostStatsError"},"PlatformStats":{"properties":{"platform":{"type":"string","title":"Platform"},"totals":{"additionalProperties":{"type":"integer"},"type":"object","title":"Totals"},"posts":{"items":{"$ref":"#/components/schemas/PostDetail"},"type":"array","title":"Posts"}},"type":"object","required":["platform","totals","posts"],"title":"PlatformStats"},"PlatformWritingInstructions":{"properties":{"common":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Common","description":"Applies to every platform."},"facebook":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Facebook"},"instagram":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Instagram"},"twitter":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Twitter"},"linkedIn":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Linkedin"},"linkedInProfile":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Linkedinprofile"},"tiktok":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Tiktok"},"pinterest":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Pinterest"},"googleBusiness":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Googlebusiness"},"instagramStory":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Instagramstory"},"youtube":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Youtube"}},"additionalProperties":false,"type":"object","title":"PlatformWritingInstructions","description":"Per-platform caption-writing instructions, as a FIXED-KEY object.\n\nWhy a typed object and not `dict[str, str]`: this is an MCP tool argument, and\na free-form dict can't be expressed in a strict JSON Schema — the model has to\ninvent both the keys and the value types. That is exactly how we got junk keys\nin `preferences` (audit-max #271) and a JSON-encoded string in `creative_types`\n(Sentry FRONTEND-3Y7). Naming every allowed key makes the wrong call impossible\nto express instead of merely invalid.\n\nMERGE-PATCH semantics: omit a platform to leave it alone. Send `\"\"` to CLEAR\nthat platform back to defaults.\n\n`\"\"` clears rather than `null`, because under strict JSON Schema every property\nis required and unspecified ones arrive as explicit `null` — so `null`-clears\nwould wipe every platform the caller didn't mean to touch on every single call\n(the regression tests/test_api_v1_papercuts.py Bug E exists to prevent). With\n`\"\"` as the sentinel, both \"absent\" and `null` mean \"don't touch\" and there is\nno ambiguity."},"PolotnoDesign":{"properties":{"schemaVersion":{"type":"integer","title":"Schemaversion","default":3},"fonts":{"items":{"$ref":"#/components/schemas/Font"},"type":"array","title":"Fonts","default":[]},"pages":{"items":{"$ref":"#/components/schemas/DesignPage"},"type":"array","title":"Pages"},"audios":{"items":{"$ref":"#/components/schemas/AudioObject"},"type":"array","title":"Audios","default":[]},"render_as":{"type":"string","title":"Render As","default":"IMAGE"},"height":{"type":"integer","title":"Height"},"width":{"type":"integer","title":"Width"}},"type":"object","required":["pages","height","width"],"title":"PolotnoDesign"},"PostBrief":{"properties":{"id":{"type":"string","title":"Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"caption_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Preview","description":"First 140 characters."},"media_ids":{"items":{"type":"string"},"type":"array","title":"Media Ids","description":"Library ids of the attached media, in order."},"scheduled_publish_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled Publish Time"},"scheduled_publish_time_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled Publish Time Local"},"revision_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revision Id","description":"Pass to revert_revisions to undo."},"warnings":{"items":{"$ref":"#/components/schemas/FieldWarning"},"type":"array","title":"Warnings"}},"type":"object","required":["id","status","caption_preview","media_ids"],"title":"PostBrief","description":"A compact view of one written post. 50 full posts would swamp an agent's context."},"PostCaptionChangePayload":{"properties":{"type":{"type":"string","title":"Type"},"table":{"type":"string","title":"Table"},"schema_name":{"type":"string","title":"Schema Name"},"record":{"$ref":"#/components/schemas/PostCaptionRecord"},"old_record":{"anyOf":[{"$ref":"#/components/schemas/PostCaptionOldRecord"},{"type":"null"}]}},"type":"object","required":["type","table","schema_name","record"],"title":"PostCaptionChangePayload"},"PostCaptionChangeRequest":{"properties":{"payload":{"$ref":"#/components/schemas/PostCaptionChangePayload"}},"type":"object","required":["payload"],"title":"PostCaptionChangeRequest"},"PostCaptionOldRecord":{"properties":{"id":{"type":"string","title":"Id"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"}},"type":"object","required":["id"],"title":"PostCaptionOldRecord"},"PostCaptionRecord":{"properties":{"id":{"type":"string","title":"Id"},"business_id":{"type":"string","title":"Business Id"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"}},"type":"object","required":["id","business_id"],"title":"PostCaptionRecord"},"PostCommentCreateRequest":{"properties":{"body":{"type":"string","maxLength":2000,"minLength":1,"title":"Body","description":"The comment text (1-2000 characters). Shows in the post's review thread in the app, where your team sees it."}},"additionalProperties":false,"type":"object","required":["body"],"title":"PostCommentCreateRequest"},"PostCommentResolveRequest":{"properties":{"resolved":{"type":"boolean","title":"Resolved","description":"true = mark the comment handled; false = reopen it."}},"additionalProperties":false,"type":"object","required":["resolved"],"title":"PostCommentResolveRequest"},"PostCommentResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Comment ID"},"body":{"type":"string","title":"Body","description":"The comment text"},"user_id":{"type":"string","title":"User Id","description":"ID of the team member who wrote the comment"},"author_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Name","description":"Display name of the team member who wrote the comment. Null when the account has no name set."},"resolved":{"type":"boolean","title":"Resolved","description":"Whether your team marked this comment as handled"},"created_at":{"type":"string","title":"Created At","description":"When the comment was written"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update time"}},"type":"object","required":["id","body","user_id","resolved","created_at"],"title":"PostCommentResponse"},"PostCreateRequest":{"properties":{"caption":{"type":"string","title":"Caption","description":"Post caption text. This is the caption every channel publishes unless it has its own in platform_overrides."},"restrict_publish_to":{"anyOf":[{"items":{"type":"string","x-extensible-enum":["facebook","instagram","twitter","linkedIn","linkedInProfile","tiktok","pinterest","googleBusiness","instagramStory","youtube"]},"type":"array"},{"type":"null"}],"title":"Restrict Publish To","description":"Restrict publishing to these platforms (e.g. instagram, facebook, linkedIn). Case-insensitive. Omit or set null to publish to ALL connected platforms."},"media_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Ids","description":"Marky media ids to attach, in order. Prefer this over media_urls whenever the media is already in Marky — an image you just generated (use its `media_id`), an upload, or a library search result. Ids are verified against your workspace, so a mistyped one fails clearly instead of looking like a broken link. Cannot be combined with media_urls or design_id. SEVERAL ids on ONE post IS a carousel: they publish as a single multi-image post in the order you list them (Instagram assembles them into a carousel, LinkedIn into a swipeable document). There is no separate carousel endpoint and you do not need one — never split the slides across several posts."},"media_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Urls","description":"URLs to images or videos to attach. Use this only for media that is NOT already in Marky — otherwise pass media_ids, which cannot be mistyped. Foreign URLs are copied into Marky storage at save time, so the link is fetched now and must be public and exact. Do not set this when design_id or media_ids is given."},"design_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Id","description":"Attach a design (from create_design) to this post. When set, media is taken from the design automatically — do NOT also pass media_urls. Editing the design later keeps this post's media in sync."},"cover_media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Media Id","description":"Marky media id of an IMAGE to use as this video's cover (the thumbnail shown before it plays). Upload the still with `POST /api/media/from-url` or `POST /api/media/uploads` first and pass the id it returns. Used by Instagram (Reel cover), Facebook and Pinterest. TikTok can only take a frame of the video itself, so it uses `video_cover_timestamp_ms` instead; LinkedIn, X, YouTube and Google Business pick their own. Ignored on a post with no video. Replacing the post's media later does NOT clear the cover — send a new one."},"video_cover_timestamp_ms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Video Cover Timestamp Ms","description":"Which frame of the video TikTok should use as its cover, in milliseconds from the start (TikTok's API takes a timestamp, never an image). Defaults to 1000 (one second in). Other platforms ignore this and use `cover_media_id` when you send one."},"status":{"type":"string","title":"Status","description":"Initial post status","default":"NEW","x-extensible-enum":["NEW","SCHEDULED"]},"scheduled_publish_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled Publish Time","description":"The exact time to publish (ISO 8601). Required if status is SCHEDULED; must be in the future. Send an offset or `Z` (e.g. `2026-09-23T09:10:00Z`) for an exact instant. A time with NO offset (e.g. `2026-09-23T09:10:00`) is read as the business's local time in its calendar timezone (UTC if it has none), daylight saving included."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link","description":"Clickable destination URL for platforms that support link posts: the Facebook link attachment, the Google Business CTA button, and the Pinterest pin destination. Other platforms ignore it — put links in the caption there. Must be http(s)."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Up to 50 string key/value pairs for your own analytics dimensions (e.g. {'media_type': 'animated-video', 'format': 'talking-head', 'style': 'data-take', 'hook': 'question', 'topic': 'automate-with-ai'}). Keys <=40 chars, values <=500 chars. Returned verbatim on every read; Marky never interprets them."},"platform_overrides":{"anyOf":[{"items":{"$ref":"#/components/schemas/PlatformOverrideModel"},"type":"array"},{"type":"null"}],"title":"Platform Overrides","description":"Per-platform variants of this post — one entry per platform you want to tailor. Unset fields fall back to the post's own values. Strongly recommended whenever a post targets more than one platform: a caption that fits Instagram is usually wrong for X/Twitter (280 chars) and LinkedIn (no hashtag walls)."},"append_caption_suffix":{"type":"boolean","title":"Append Caption Suffix","description":"Set true to have Marky append the business's caption suffix (its hashtag block / sign-off) to the caption. Never type the suffix yourself; with this set it appears exactly once, and hashtags it already carries are removed from the body.","default":false},"allow_media_reuse":{"type":"boolean","title":"Allow Media Reuse","description":"Leave false. Set true only when the user asked to post a specific photo again (a throwback, a signature shot). Without it, a library photo another recent post already uses is refused with 409 MEDIA_RECENTLY_USED; search the library again and pick a photo you have not used.","default":false},"restrict_publish_to_integration_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Restrict Publish To Integration Ids","description":"Restrict publishing to these exact connected accounts (integration ids from `GET /businesses/{business_id}/integrations`). Use instead of restrict_publish_to when a business has multiple accounts of the same platform and you want specific ones. Omit or set null for platform-level targeting. Cannot be combined with restrict_publish_to in one request."}},"additionalProperties":false,"type":"object","required":["caption"],"title":"PostCreateRequest"},"PostDesignEditRequest":{"properties":{"instruction":{"type":"string","minLength":1,"title":"Instruction","description":"What to change, e.g. 'make the headline tan' or 'center the logo'."}},"additionalProperties":false,"type":"object","required":["instruction"],"title":"PostDesignEditRequest","description":"A plain-language instruction to change a post's design."},"PostDesignEditResponse":{"properties":{"post_id":{"type":"string","title":"Post Id","description":"The post that was edited."},"design_id":{"type":"string","title":"Design Id","description":"The design that was edited."},"rendered_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rendered Url","description":"URL of the final rendered design image."},"media_urls":{"items":{"type":"string"},"type":"array","title":"Media Urls","description":"Full media URLs written back to the post."},"summary":{"type":"string","title":"Summary","description":"Short description of what changed."},"applied":{"type":"integer","title":"Applied","description":"Number of edits successfully applied."},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","description":"Edits that could not be applied."}},"type":"object","required":["post_id","design_id","summary","applied"],"title":"PostDesignEditResponse","description":"Result of a natural-language design edit."},"PostDetail":{"properties":{"id":{"type":"string","title":"Id"},"external_post_id":{"type":"string","title":"External Post Id"},"platform":{"type":"string","title":"Platform"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"permalink_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink Url"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At"},"views":{"type":"integer","title":"Views","default":0},"likes":{"type":"integer","title":"Likes","default":0},"comments":{"type":"integer","title":"Comments","default":0},"shares":{"type":"integer","title":"Shares","default":0},"saves":{"type":"integer","title":"Saves","default":0}},"type":"object","required":["id","external_post_id","platform"],"title":"PostDetail"},"PostIdeaCreateRequest":{"properties":{"body":{"type":"string","title":"Body","description":"The post idea text (a seed, not a finished caption)."},"topic_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Id","description":"Topic this idea belongs to, if any."},"bookmarked":{"type":"boolean","title":"Bookmarked","description":"Whether the idea is bookmarked/saved.","default":false}},"additionalProperties":false,"type":"object","required":["body"],"title":"PostIdeaCreateRequest"},"PostIdeaResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Post idea ID"},"business_id":{"type":"string","title":"Business Id","description":"Business this idea belongs to"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"The post idea text"},"topic_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Id","description":"Topic this idea belongs to"},"bookmarked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bookmarked","description":"Whether it's bookmarked"},"created_at":{"type":"string","title":"Created At","description":"When the idea was created"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update time"}},"type":"object","required":["id","business_id","created_at"],"title":"PostIdeaResponse"},"PostIdeaUpdateRequest":{"properties":{"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"The post idea text."},"topic_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Id","description":"Topic this idea belongs to."},"bookmarked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bookmarked","description":"Whether the idea is bookmarked/saved."}},"additionalProperties":false,"type":"object","title":"PostIdeaUpdateRequest"},"PostImage":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url","description":"Regular-size image URL"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"Thumbnail URL"},"description":{"type":"string","title":"Description","default":""},"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"},"photographer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photographer"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"source":{"type":"string","title":"Source","description":"Image source: unsplash, giphy, library, user","default":"unsplash"},"media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Id","description":"Existing business_media ID (library images)"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds","description":"Video clip duration (pexels-video only)"}},"type":"object","required":["id","url","width","height"],"title":"PostImage","description":"An image used in a generated post.\n\nSource-agnostic: wraps results from Unsplash, Giphy, library, or user-provided URLs.\nWhen media_id is set (library images), the business_media record already exists."},"PostMedia":{"properties":{"id":{"type":"string","title":"Id","description":"Media ID in the business's library"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Public URL of the media"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type","description":"'image', 'video', or 'audio'"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"What the media shows, generated by a vision model — including any headline or offer text rendered into the graphic, which on a designed post is usually the whole message. Null if not described yet."},"transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transcript","description":"Spoken words in the video or audio, if any."},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration","description":"Length in seconds, for video and audio."}},"type":"object","required":["id"],"title":"PostMedia","description":"One piece of media attached to a post, described rather than just addressed."},"PostMediaUrlsChangePayload":{"properties":{"type":{"type":"string","title":"Type"},"table":{"type":"string","title":"Table"},"schema_name":{"type":"string","title":"Schema Name"},"record":{"$ref":"#/components/schemas/PostMediaUrlsRecord"},"old_record":{"anyOf":[{"$ref":"#/components/schemas/PostMediaUrlsOldRecord"},{"type":"null"}]}},"type":"object","required":["type","table","schema_name","record"],"title":"PostMediaUrlsChangePayload"},"PostMediaUrlsChangeRequest":{"properties":{"payload":{"$ref":"#/components/schemas/PostMediaUrlsChangePayload"}},"type":"object","required":["payload"],"title":"PostMediaUrlsChangeRequest"},"PostMediaUrlsOldRecord":{"properties":{"id":{"type":"string","title":"Id"},"media_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Urls"}},"type":"object","required":["id"],"title":"PostMediaUrlsOldRecord"},"PostMediaUrlsRecord":{"properties":{"id":{"type":"string","title":"Id"},"business_id":{"type":"string","title":"Business Id"},"media_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Urls"}},"type":"object","required":["id","business_id"],"title":"PostMediaUrlsRecord"},"PostMetric":{"properties":{"name":{"type":"string","title":"Name","description":"Metric identifier (likes, comments, etc.)"},"period":{"type":"string","title":"Period","description":"Metric period, typically lifetime"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Human friendly title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Metric description from the provider"},"metric_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Id","description":"Provider-specific metric identifier"},"values":{"items":{"$ref":"#/components/schemas/PostMetricValue"},"type":"array","title":"Values","description":"Values returned for the metric"}},"type":"object","required":["name","period"],"title":"PostMetric","description":"Metric definition and values for a single post."},"PostMetricValue":{"properties":{"value":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Value","description":"Metric value"},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time","description":"Start time when provided by the API"},"end_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time when provided by the API"}},"type":"object","required":["value"],"title":"PostMetricValue","description":"Point-in-time metric value."},"PostPublishRequest":{"properties":{"restrict_publish_to":{"anyOf":[{"items":{"type":"string","x-extensible-enum":["facebook","instagram","twitter","linkedIn","linkedInProfile","tiktok","pinterest","googleBusiness","instagramStory","youtube"]},"type":"array"},{"type":"null"}],"title":"Restrict Publish To","description":"Restrict publishing to these platforms (e.g. instagram, facebook, linkedIn). Case-insensitive. Omit or set null to publish to ALL connected platforms."},"restrict_publish_to_integration_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Restrict Publish To Integration Ids","description":"Restrict publishing to these exact connected accounts (integration ids from `GET /businesses/{business_id}/integrations`). Use instead of restrict_publish_to when a business has multiple accounts of the same platform and you want specific ones. Omit or set null for platform-level targeting. Cannot be combined with restrict_publish_to in one request."}},"additionalProperties":false,"type":"object","title":"PostPublishRequest"},"PostPublishedRequest":{"properties":{"post_id":{"type":"string","title":"Post Id"},"business_id":{"type":"string","title":"Business Id"},"successful_platforms":{"items":{"$ref":"#/components/schemas/SuccessfulPlatform"},"type":"array","title":"Successful Platforms"}},"type":"object","required":["post_id","business_id","successful_platforms"],"title":"PostPublishedRequest"},"PostRecipe":{"properties":{"idea":{"type":"string","title":"Idea","description":"The post idea text — the core content"},"idea_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idea Id","description":"DB id from post_ideas table, if persisted"},"topic_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Id"},"topic_title":{"type":"string","title":"Topic Title","default":""},"topic_body":{"type":"string","title":"Topic Body","default":""},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name"},"creative_format":{"type":"string","title":"Creative Format","default":"design","x-extensible-enum":["design","carousel","meme","image","gif","video","ai-image","ai-video"]},"template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Id"},"search_context":{"type":"string","title":"Search Context","description":"Web/file search context for content generation","default":""},"recent_ideas":{"items":{"type":"string"},"type":"array","title":"Recent Ideas","description":"Recent ideas for dedup"}},"type":"object","required":["idea"],"title":"PostRecipe","description":"A fully specified recipe for one post. Output of planning, input to generation.\n\nThis is what the user sees and edits. It contains everything needed to generate\na post without any further DB reads for business/content data. The idea field is\nthe text blob. Everything else is the creative direction (\"ingredients\")."},"PostResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Post ID"},"business_id":{"type":"string","title":"Business Id","description":"Business this post belongs to"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption","description":"Post caption text"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Post status. One of: NEW (draft awaiting your team's review, incl. freshly generated), DRAFT (approved by a reviewer on your team), REJECTED (declined by a reviewer), SCHEDULED (queued for a future time), PUBLISHED (already posted). DRAFT/REJECTED are your team's review verdicts — Marky does not gate publishing on them. Same values the `list_posts` status filter accepts."},"media_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Urls","description":"Attached media URLs"},"media_details":{"anyOf":[{"items":{"$ref":"#/components/schemas/PostMedia"},"type":"array"},{"type":"null"}],"title":"Media Details","description":"The same attached media as `media_urls`, in the same order, but with each item's description and transcript. Use this when analysing what content performs: the creative is usually the reason a post did well, and a URL alone tells you nothing about what was in it."},"design_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Id","description":"The design attached to this post, if any. Media is derived from this design; edit it with revise_post_design or create_design + a new link."},"cover_media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Media Id","description":"Media id of the cover image shown before this post's video plays. Marky generates one from the first frame when you don't send one."},"video_cover_timestamp_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Video Cover Timestamp Ms","description":"The frame (milliseconds from the start) TikTok uses as its cover. Null when nobody has chosen a cover for this post."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link","description":"Clickable destination URL for platforms that support link posts: the Facebook link attachment, the Google Business CTA button, and the Pinterest pin destination. Other platforms ignore it — put links in the caption there. Must be http(s)."},"restrict_publish_to":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Restrict Publish To","description":"Platforms this post is restricted to. Null means ALL connected platforms."},"restrict_publish_to_integration_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Restrict Publish To Integration Ids","description":"Exact connected accounts (integration ids) this post is restricted to. Null means targeting is platform-level (see restrict_publish_to)."},"scheduled_publish_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled Publish Time","description":"The exact time this post is scheduled to publish (set via `schedule`). Null for drafts, queued posts, and already-published posts."},"scheduled_publish_time_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled Publish Time Local","description":"The same moment in the business's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting the UTC value."},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"IANA timezone the `*_local` times are in: the business's calendar timezone, or \"UTC\" when the business hasn't set one (see `timezone_source`)."},"timezone_source":{"anyOf":[{"type":"string","enum":["business","unset_utc"]},{"type":"null"}],"title":"Timezone Source","description":"Where `timezone` came from: `business` (the business's own setting) or `unset_utc` (no timezone saved yet, so times are shown in UTC)."},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At","description":"When the post was actually published (past timestamp). Null until it publishes."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Caller-defined string key/value pairs set at create/update time — your own analytics dimensions (e.g. media_type, format, style, hook, topic). Marky returns them verbatim and never interprets them. Keys starting with `marky_` are Marky's own (e.g. the copy date below); any you send are dropped."},"copy_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Copy Date","description":"The day this caption is about, read from the caption when it was written: an upcoming holiday of the business's country, one of the business's events, or an explicit date like 'September 25'. Never 'today'/'tomorrow'. Queueing never places the post after this day. Null when the caption names no date."},"copy_moment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Copy Moment","description":"The moment the caption names, e.g. 'National Day'. Null for a plain date."},"suggested_publish_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Publish Time","description":"When to publish on `copy_date`: the business's first posting-schedule slot that day, else 10:00 local. Offer it as the post's date; schedule with `at` to use it."},"suggested_publish_time_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Publish Time Local","description":"The same moment in the business's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting the UTC value."},"platform_overrides":{"anyOf":[{"items":{"$ref":"#/components/schemas/PlatformOverrideModel"},"type":"array"},{"type":"null"}],"title":"Platform Overrides","description":"Per-platform content overrides on this post, if any. Each platform publishes its override fields where set, the post's own fields otherwise."},"publish_results":{"items":{"$ref":"#/components/schemas/PublishResultResponse"},"type":"array","title":"Publish Results","description":"Per-platform publish outcomes — one entry per platform this post was sent to. Poll this until every entry has a terminal status (`success` or `failed`) to know publishing is complete."},"queue":{"anyOf":[{"$ref":"#/components/schemas/QueueInfo"},{"type":"null"}],"description":"Daily-queue placement. Present only when the post is in a recurring daily queue (status SCHEDULED with no `adhoc_publish_time`). Null for drafts, adhoc-scheduled, and published posts."},"publish_readiness":{"anyOf":[{"$ref":"#/components/schemas/PublishReadiness"},{"type":"null"}],"description":"Returned by queue, schedule and publish: which platforms this post will actually publish to, and which connected accounts won't get it and why. Null on reads."},"repeating_cron":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repeating Cron","description":"If set, this post repeats: a standard 5-field cron string (e.g. '0 9 * * 1' = every Monday 9am UTC). When it publishes, Marky auto-creates the next occurrence at the next cron time. Null = a one-off post."},"created_at":{"type":"string","title":"Created At","description":"When the post was created"},"warnings":{"items":{"$ref":"#/components/schemas/FieldWarning"},"type":"array","title":"Warnings","description":"Non-blocking notes about this post's captions, e.g. a call-to-action with no link or phone ('cta_without_contact'), or a caption in a different language from the business ('language_mismatch'). Empty when there is nothing to fix. Fix them with update_post before the post publishes; they never block anything."},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update time"},"revision_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revision Id","description":"Id of the undo record this write created. Pass it to revert_revisions to put the record back exactly as it was before this call. Set only on the response to a write; null when you read the record."},"url":{"type":"string","title":"Url","description":"Link to view this post in the Marky app (openable/shareable — show it to the user). This is where the post lives in Marky; `link` is the outbound URL published with the post.","readOnly":true},"delivery":{"anyOf":[{"type":"string","enum":["pending","delivered","partial","failed"]},{"type":"null"}],"title":"Delivery","description":"What actually reached the platforms, from publish_results: 'delivered' (every platform succeeded), 'partial' (some succeeded, some failed), 'failed' (every platform failed), 'pending' (still in progress). Null when no publish has been attempted. Prefer this over `status` to tell the user whether a post went out.","readOnly":true},"scheduled_posts_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled Posts Url","description":"Link to the workspace's scheduled-posts list in the Marky app — where the user sees this post waiting in the lineup. Present once the post is SCHEDULED; null otherwise.","readOnly":true}},"type":"object","required":["id","business_id","created_at","url","delivery","scheduled_posts_url"],"title":"PostResponse"},"PostResult":{"properties":{"post_id":{"type":"string","title":"Post Id","description":"ID of the created post"},"title":{"type":"string","title":"Title","description":"Short post title (max 7 words) for platforms that use titles","default":""},"caption":{"type":"string","title":"Caption"},"idea":{"type":"string","title":"Idea","description":"The generated post idea"},"creative_format":{"type":"string","title":"Creative Format","description":"The creative format used for this post","default":"design","x-extensible-enum":["design","carousel","meme","image","gif","video","ai-image","ai-video"]},"text_content":{"additionalProperties":{"type":"string"},"type":"object","title":"Text Content","description":"component_id → text for all filled slots"},"slides":{"items":{"$ref":"#/components/schemas/SlideResult"},"type":"array","title":"Slides","description":"Images used in the design (one per page with fillers)"},"topic_title":{"type":"string","title":"Topic Title","description":"Topic used for this post"},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name","description":"Category of the topic"},"template_id":{"type":"string","title":"Template Id","description":"Design template used"},"theme_name":{"type":"string","title":"Theme Name","description":"Theme of the template"},"rendered_urls":{"items":{"type":"string"},"type":"array","title":"Rendered Urls","description":"CloudFront URLs of rendered slide images"},"score":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Score","description":"Quality scores: hook_caption, hook_visual, depth, design_text, design_photos, overall"}},"type":"object","required":["post_id","caption","idea","text_content","slides","topic_title","category_name","template_id","theme_name"],"title":"PostResult"},"PostReviewOldRecord":{"properties":{"id":{"type":"string","title":"Id"},"review_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Status"}},"type":"object","required":["id"],"title":"PostReviewOldRecord"},"PostReviewRecord":{"properties":{"id":{"type":"string","title":"Id"},"business_id":{"type":"string","title":"Business Id"},"review_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Status"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"media_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Urls"},"acting_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acting User Id"}},"type":"object","required":["id","business_id"],"title":"PostReviewRecord"},"PostReviewStatusChangePayload":{"properties":{"type":{"type":"string","title":"Type"},"table":{"type":"string","title":"Table"},"schema_name":{"type":"string","title":"Schema Name"},"record":{"$ref":"#/components/schemas/PostReviewRecord"},"old_record":{"anyOf":[{"$ref":"#/components/schemas/PostReviewOldRecord"},{"type":"null"}]}},"type":"object","required":["type","table","schema_name","record"],"title":"PostReviewStatusChangePayload"},"PostReviewStatusChangeRequest":{"properties":{"payload":{"$ref":"#/components/schemas/PostReviewStatusChangePayload"}},"type":"object","required":["payload"],"title":"PostReviewStatusChangeRequest"},"PostSample":{"properties":{"caption_excerpt":{"type":"string","title":"Caption Excerpt","description":"First ~140 chars of the caption (or title), trimmed"},"platform":{"type":"string","title":"Platform","description":"Platform the post was published to"},"media_type":{"type":"string","title":"Media Type","description":"Media type (Video, Image, Carousel, Text)"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"User-assigned category name (or null if uncategorized)"},"published_date":{"type":"string","title":"Published Date","description":"ISO date (YYYY-MM-DD) the post was published"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"Thumbnail URL (or video preview frame) for the post"},"likes":{"type":"integer","title":"Likes","default":0},"comments":{"type":"integer","title":"Comments","default":0},"clicks":{"type":"integer","title":"Clicks","default":0},"engagement":{"type":"integer","title":"Engagement","description":"Total engagement (likes + comments + shares + clicks)"}},"type":"object","required":["caption_excerpt","platform","media_type","published_date","engagement"],"title":"PostSample","description":"A specific post sampled into the prompt (best or worst) so the LLM can name it."},"PostScheduleRequest":{"properties":{"scheduled_publish_time":{"type":"string","format":"date-time","title":"Scheduled Publish Time","description":"When to publish (ISO 8601 datetime, must be in the future). Send an offset or `Z` (e.g. `2026-09-23T09:10:00Z`) for an exact instant. A time with NO offset (e.g. `2026-09-23T09:10:00`) is read as the business's local time in its calendar timezone (UTC if it has none), daylight saving included."},"restrict_publish_to":{"anyOf":[{"items":{"type":"string","x-extensible-enum":["facebook","instagram","twitter","linkedIn","linkedInProfile","tiktok","pinterest","googleBusiness","instagramStory","youtube"]},"type":"array"},{"type":"null"}],"title":"Restrict Publish To","description":"Restrict publishing to these platforms (e.g. instagram, facebook, linkedIn). Case-insensitive. Omit or set null to publish to ALL connected platforms."},"restrict_publish_to_integration_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Restrict Publish To Integration Ids","description":"Restrict publishing to these exact connected accounts (integration ids from `GET /businesses/{business_id}/integrations`). Use instead of restrict_publish_to when a business has multiple accounts of the same platform and you want specific ones. Omit or set null for platform-level targeting. Cannot be combined with restrict_publish_to in one request."},"repeating_cron":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repeating Cron","description":"Recurrence for this post — this endpoint is the ONLY place it's set. A standard 5-field cron string (e.g. '0 9 * * 1' = every Monday 9am UTC): scheduled_publish_time is the first run, then after each publish Marky auto-creates the next occurrence at the next cron time. Omit for a one-off post; re-schedule with repeating_cron=null to STOP an existing recurrence."}},"additionalProperties":false,"type":"object","required":["scheduled_publish_time"],"title":"PostScheduleRequest"},"PostStatRow":{"properties":{"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform","description":"Publishing platform."},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At","description":"ISO publish timestamp."},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption","description":"Post caption."},"permalink_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink Url","description":"Public permalink."},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"Thumbnail image URL."},"likes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Likes","description":"Like count."},"comment_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Comment Count","description":"Comment count."},"shares":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shares","description":"Share count."},"saves":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saves","description":"Save count."},"reach":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reach","description":"Unique accounts reached."},"impressions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Impressions","description":"Total impressions."},"clicks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Clicks","description":"Link clicks."},"views":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Views","description":"Video/photo views."},"engagements":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Engagements","description":"Total engagements."},"media_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Type","description":"Media type (image/video/etc)."},"internal_post_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Internal Post Title","description":"Internal post title."},"category":{"type":"string","title":"Category","description":"Content category name (lowercased).","default":"uncategorized"}},"type":"object","title":"PostStatRow","description":"One published post with its engagement/reach metrics from posts_with_stats."},"PostStats":{"properties":{"fetched_at":{"type":"string","format":"date-time","title":"Fetched At"},"likes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Likes"},"comment_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Comment Count"},"impressions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Impressions"},"shares":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shares"},"reach":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reach"},"saves":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saves"},"clicks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Clicks"},"views":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Views"},"video_duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Video Duration Ms"},"avg_watch_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Avg Watch Time Ms"},"total_watch_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Watch Time Ms"},"completion_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Completion Rate"},"video_views_organic":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Video Views Organic"},"video_views_paid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Video Views Paid"}},"type":"object","title":"PostStats","description":"Statistics for a single post."},"PostStatsQuery":{"properties":{"platform":{"type":"string","title":"Platform"},"account_id":{"type":"string","title":"Account Id"},"post_id":{"type":"string","title":"Post Id"},"token":{"type":"string","title":"Token"},"metrics":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Metrics"}},"type":"object","required":["platform","account_id","post_id","token"],"title":"PostStatsQuery","description":"Validated query parameters for /post-stats."},"PostStatusChangePayload":{"properties":{"type":{"type":"string","title":"Type"},"table":{"type":"string","title":"Table"},"schema_name":{"type":"string","title":"Schema Name"},"record":{"$ref":"#/components/schemas/PostStatusRecord"},"old_record":{"anyOf":[{"$ref":"#/components/schemas/PostStatusOldRecord"},{"type":"null"}]}},"type":"object","required":["type","table","schema_name","record"],"title":"PostStatusChangePayload"},"PostStatusChangeRequest":{"properties":{"payload":{"$ref":"#/components/schemas/PostStatusChangePayload"}},"type":"object","required":["payload"],"title":"PostStatusChangeRequest"},"PostStatusOldRecord":{"properties":{"id":{"type":"string","title":"Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","required":["id"],"title":"PostStatusOldRecord"},"PostStatusRecord":{"properties":{"id":{"type":"string","title":"Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","required":["id"],"title":"PostStatusRecord"},"PostSummaryResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Post ID"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Post status — same values as the list_posts status filter (NEW/DRAFT/REJECTED/SCHEDULED/PUBLISHED)."},"caption_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Preview","description":"First ~140 characters of the caption. Omit `view` (or pass view=full) for the whole caption plus publish_results and overrides."},"media_count":{"type":"integer","format":"int32","title":"Media Count","description":"Number of attached media items.","default":0},"media_fingerprint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Fingerprint","description":"Short stable hash of the attached media URLs. Equal fingerprints mean the same media set — spot duplicate media across posts without pulling every URL. Null when the post has no media."},"restrict_publish_to":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Restrict Publish To","description":"Platforms this post is restricted to. Null means ALL connected platforms."},"scheduled_publish_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled Publish Time","description":"When this post is scheduled to publish. Null for drafts, queued posts, and already-published posts."},"published_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published At","description":"When the post was actually published. Null until it publishes."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Caller-defined string key/value pairs set at create/update time. Returned verbatim."},"created_at":{"type":"string","title":"Created At","description":"When the post was created"}},"type":"object","required":["id","created_at"],"title":"PostSummaryResponse","description":"A lightweight post row for scanning or de-duping a large history cheaply.\n\n`list_posts?view=summary` returns these instead of PostResponse: the same\nrows, but with a caption PREVIEW instead of the full body and no\npublish_results / platform_overrides / queue enrichment. A real agent report\n(api_feedback f00931e9 / 552395ad) blew its tool's token budget on a 100-post\npage of full PostResponse; this is the cheap path for auditing a history."},"PostTextPromptInputs":{"properties":{"topic":{"type":"string","title":"Topic","description":"Topic or directive"},"context":{"type":"string","title":"Context","description":"Business context/description","default":""},"facts":{"type":"string","title":"Facts","description":"Factual information to preserve exactly","default":""},"tone":{"type":"string","title":"Tone","description":"Brand tone/voice"},"language":{"type":"string","title":"Language","description":"Language to write in"},"caption_suffix":{"type":"string","title":"Caption Suffix","description":"Appended to caption (e.g. hashtags)","default":""},"graphic_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Graphic Description","description":"Description of the graphic"},"caption_writing_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Writing Rules","description":"Extra instructions for the LLM"},"business_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Name","description":"Business name"},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagline","description":"Business tagline"},"cta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta","description":"Call to action text"}},"type":"object","required":["topic","tone","language"],"title":"PostTextPromptInputs"},"PostType":{"type":"string","title":"PostType","description":"Type of social media post.","x-extensible-enum":["Text","Image","Carousel","Video","Story","Reel","Unknown"]},"PostTypeBreakdown":{"properties":{"type":{"type":"string","title":"Type","description":"Content type (Video, Image, Carousel, Text)"},"count":{"type":"integer","title":"Count","description":"Number of posts of this type"},"avg_engagement":{"type":"number","title":"Avg Engagement","description":"Average engagement per post"}},"type":"object","required":["type","count","avg_engagement"],"title":"PostTypeBreakdown","description":"Post count and engagement by content type."},"PostUpdateItem":{"properties":{"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption","description":"Updated caption text. Note that a channel listed in platform_overrides with its own caption publishes THAT caption, not this one. To change what every channel publishes, either send platform_overrides in the same call with the new per-channel captions, or send platform_overrides: [] to drop the overrides so every channel falls back to this caption. Read the post first to see which channels have one."},"status":{"anyOf":[{"type":"string","x-extensible-enum":["NEW","DRAFT","REJECTED"]},{"type":"null"}],"title":"Status","description":"Move this post through your team's review workflow. NEW = notify your team the post is ready for review (it shows up on the app's review page). DRAFT = a reviewer approved it. REJECTED = a reviewer declined it. These are your team's workflow state — Marky does not gate publishing on them. Only allowed on posts currently in NEW, DRAFT, or REJECTED (use the schedule endpoint to schedule; published posts are immutable)."},"restrict_publish_to":{"anyOf":[{"items":{"type":"string","x-extensible-enum":["facebook","instagram","twitter","linkedIn","linkedInProfile","tiktok","pinterest","googleBusiness","instagramStory","youtube"]},"type":"array"},{"type":"null"}],"title":"Restrict Publish To","description":"Restrict publishing to these platforms (e.g. instagram, facebook, linkedIn). Case-insensitive. Omit or set null to publish to ALL connected platforms."},"media_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Ids","description":"Replace the attached media, by library id. Marky media ids to attach, in order. Prefer this over media_urls whenever the media is already in Marky — an image you just generated (use its `media_id`), an upload, or a library search result. Ids are verified against your workspace, so a mistyped one fails clearly instead of looking like a broken link. Cannot be combined with media_urls or design_id. SEVERAL ids on ONE post IS a carousel: they publish as a single multi-image post in the order you list them (Instagram assembles them into a carousel, LinkedIn into a swipeable document). There is no separate carousel endpoint and you do not need one — never split the slides across several posts."},"allow_media_reuse":{"type":"boolean","title":"Allow Media Reuse","description":"Leave false. Set true only when the user asked to post a specific photo again (a throwback, a signature shot). Without it, a library photo another recent post already uses is refused with 409 MEDIA_RECENTLY_USED; search the library again and pick a photo you have not used.","default":false},"media_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Urls","description":"Replace the attached media. URLs to images or videos. Use this to swap the image on a generated post during review. Prefer media_ids when the media is already in Marky. Do not set this when design_id is given — media comes from the design automatically."},"design_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Id","description":"Attach a design (from create_design) to this post. When set, media is taken from the design automatically — do NOT also pass media_urls. Editing the design later keeps this post's media in sync."},"cover_media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Media Id","description":"Replace this video's cover image. Marky media id of an IMAGE to use as this video's cover (the thumbnail shown before it plays). Upload the still with `POST /api/media/from-url` or `POST /api/media/uploads` first and pass the id it returns. Used by Instagram (Reel cover), Facebook and Pinterest. TikTok can only take a frame of the video itself, so it uses `video_cover_timestamp_ms` instead; LinkedIn, X, YouTube and Google Business pick their own. Ignored on a post with no video. Replacing the post's media later does NOT clear the cover — send a new one."},"video_cover_timestamp_ms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Video Cover Timestamp Ms","description":"Which frame of the video TikTok should use as its cover, in milliseconds from the start (TikTok's API takes a timestamp, never an image). Defaults to 1000 (one second in). Other platforms ignore this and use `cover_media_id` when you send one."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link","description":"Clickable destination URL for platforms that support link posts: the Facebook link attachment, the Google Business CTA button, and the Pinterest pin destination. Other platforms ignore it — put links in the caption there. Must be http(s)."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Up to 50 string key/value pairs for your own analytics dimensions (e.g. {'media_type': 'animated-video', 'format': 'talking-head', 'style': 'data-take', 'hook': 'question', 'topic': 'automate-with-ai'}). Keys <=40 chars, values <=500 chars. Returned verbatim on every read; Marky never interprets them."},"platform_overrides":{"anyOf":[{"items":{"$ref":"#/components/schemas/PlatformOverrideModel"},"type":"array"},{"type":"null"}],"title":"Platform Overrides","description":"REPLACES the post's entire override set: send the full list you want to keep, send [] to clear all overrides, or omit/null to leave them unchanged."},"restrict_publish_to_integration_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Restrict Publish To Integration Ids","description":"Restrict publishing to these exact connected accounts (integration ids from `GET /businesses/{business_id}/integrations`). Use instead of restrict_publish_to when a business has multiple accounts of the same platform and you want specific ones. Omit or set null for platform-level targeting. Cannot be combined with restrict_publish_to in one request."},"post_id":{"type":"string","format":"uuid","title":"Post Id","description":"The post to update."}},"additionalProperties":false,"type":"object","required":["post_id"],"title":"PostUpdateItem","description":"One explicit edit: which post, plus any update_post fields."},"PostUpdateRequest":{"properties":{"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption","description":"Updated caption text. Note that a channel listed in platform_overrides with its own caption publishes THAT caption, not this one. To change what every channel publishes, either send platform_overrides in the same call with the new per-channel captions, or send platform_overrides: [] to drop the overrides so every channel falls back to this caption. Read the post first to see which channels have one."},"status":{"anyOf":[{"type":"string","x-extensible-enum":["NEW","DRAFT","REJECTED"]},{"type":"null"}],"title":"Status","description":"Move this post through your team's review workflow. NEW = notify your team the post is ready for review (it shows up on the app's review page). DRAFT = a reviewer approved it. REJECTED = a reviewer declined it. These are your team's workflow state — Marky does not gate publishing on them. Only allowed on posts currently in NEW, DRAFT, or REJECTED (use the schedule endpoint to schedule; published posts are immutable)."},"restrict_publish_to":{"anyOf":[{"items":{"type":"string","x-extensible-enum":["facebook","instagram","twitter","linkedIn","linkedInProfile","tiktok","pinterest","googleBusiness","instagramStory","youtube"]},"type":"array"},{"type":"null"}],"title":"Restrict Publish To","description":"Restrict publishing to these platforms (e.g. instagram, facebook, linkedIn). Case-insensitive. Omit or set null to publish to ALL connected platforms."},"media_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Ids","description":"Replace the attached media, by library id. Marky media ids to attach, in order. Prefer this over media_urls whenever the media is already in Marky — an image you just generated (use its `media_id`), an upload, or a library search result. Ids are verified against your workspace, so a mistyped one fails clearly instead of looking like a broken link. Cannot be combined with media_urls or design_id. SEVERAL ids on ONE post IS a carousel: they publish as a single multi-image post in the order you list them (Instagram assembles them into a carousel, LinkedIn into a swipeable document). There is no separate carousel endpoint and you do not need one — never split the slides across several posts."},"allow_media_reuse":{"type":"boolean","title":"Allow Media Reuse","description":"Leave false. Set true only when the user asked to post a specific photo again (a throwback, a signature shot). Without it, a library photo another recent post already uses is refused with 409 MEDIA_RECENTLY_USED; search the library again and pick a photo you have not used.","default":false},"media_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Urls","description":"Replace the attached media. URLs to images or videos. Use this to swap the image on a generated post during review. Prefer media_ids when the media is already in Marky. Do not set this when design_id is given — media comes from the design automatically."},"design_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Design Id","description":"Attach a design (from create_design) to this post. When set, media is taken from the design automatically — do NOT also pass media_urls. Editing the design later keeps this post's media in sync."},"cover_media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Media Id","description":"Replace this video's cover image. Marky media id of an IMAGE to use as this video's cover (the thumbnail shown before it plays). Upload the still with `POST /api/media/from-url` or `POST /api/media/uploads` first and pass the id it returns. Used by Instagram (Reel cover), Facebook and Pinterest. TikTok can only take a frame of the video itself, so it uses `video_cover_timestamp_ms` instead; LinkedIn, X, YouTube and Google Business pick their own. Ignored on a post with no video. Replacing the post's media later does NOT clear the cover — send a new one."},"video_cover_timestamp_ms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Video Cover Timestamp Ms","description":"Which frame of the video TikTok should use as its cover, in milliseconds from the start (TikTok's API takes a timestamp, never an image). Defaults to 1000 (one second in). Other platforms ignore this and use `cover_media_id` when you send one."},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link","description":"Clickable destination URL for platforms that support link posts: the Facebook link attachment, the Google Business CTA button, and the Pinterest pin destination. Other platforms ignore it — put links in the caption there. Must be http(s)."},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Up to 50 string key/value pairs for your own analytics dimensions (e.g. {'media_type': 'animated-video', 'format': 'talking-head', 'style': 'data-take', 'hook': 'question', 'topic': 'automate-with-ai'}). Keys <=40 chars, values <=500 chars. Returned verbatim on every read; Marky never interprets them."},"platform_overrides":{"anyOf":[{"items":{"$ref":"#/components/schemas/PlatformOverrideModel"},"type":"array"},{"type":"null"}],"title":"Platform Overrides","description":"REPLACES the post's entire override set: send the full list you want to keep, send [] to clear all overrides, or omit/null to leave them unchanged."},"restrict_publish_to_integration_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Restrict Publish To Integration Ids","description":"Restrict publishing to these exact connected accounts (integration ids from `GET /businesses/{business_id}/integrations`). Use instead of restrict_publish_to when a business has multiple accounts of the same platform and you want specific ones. Omit or set null for platform-level targeting. Cannot be combined with restrict_publish_to in one request."}},"additionalProperties":false,"type":"object","title":"PostUpdateRequest"},"PostingScheduleResponse":{"properties":{"queue_id":{"type":"string","title":"Queue Id","description":"ID of the publish queue backing this schedule."},"business_id":{"type":"string","title":"Business Id","description":"Business this schedule belongs to."},"timeslots":{"items":{"type":"string"},"type":"array","title":"Timeslots","description":"Weekly recurring slots in 'DAY HH:MM' 24h form, e.g. ['MON 15:00', 'FRI 09:30']. A queued post publishes at the next upcoming slot."},"jitter_minutes":{"type":"integer","format":"int32","title":"Jitter Minutes","description":"Random +/- minutes applied to each slot so posts don't fire at the exact same second every day."},"next_publish_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Publish Time","description":"When the next queued post is due to publish, computed from the schedule. Null if not yet computed, or if the schedule is paused."},"next_publish_time_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Publish Time Local","description":"The same moment in the business's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting the UTC value."},"timeslots_local":{"items":{"type":"string"},"type":"array","title":"Timeslots Local","description":"`timeslots` on the business's clock, same order, e.g. 'MON 15:00' (UTC) is 'MON 18:00' in Moscow. The day can change when the offset crosses midnight."},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"IANA timezone the `*_local` times are in: the business's calendar timezone, or \"UTC\" when the business hasn't set one (see `timezone_source`)."},"timezone_source":{"anyOf":[{"type":"string","enum":["business","unset_utc"]},{"type":"null"}],"title":"Timezone Source","description":"Where `timezone` came from: `business` (the business's own setting) or `unset_utc` (no timezone saved yet, so times are shown in UTC)."},"paused":{"type":"boolean","title":"Paused","description":"True while the schedule is paused: no queued post publishes, and the timeslots and queued posts are kept as they are.","default":false}},"type":"object","required":["queue_id","business_id","timeslots","jitter_minutes"],"title":"PostingScheduleResponse","description":"A business's recurring posting schedule (its daily publish queue)."},"PostingScheduleUpdateRequest":{"properties":{"timeslots":{"items":{"type":"string"},"type":"array","title":"Timeslots","description":"Weekly recurring slots in UTC, 'DAY HH:MM' 24h form, e.g. ['MON 15:00', 'FRI 09:30']. Replaces the whole schedule. These are UTC, NOT the business's local time: to use the hour the owner said (e.g. '1pm' in Chicago), send `timeslots_local` instead. Send exactly one of the two."},"timeslots_local":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Timeslots Local","description":"The same weekly slots on the business's own clock, 'DAY HH:MM' 24h form, e.g. ['MON 13:00'] for 1 PM local. Prefer this when the owner names a time: it is converted to UTC for you, and the response's `timeslots_local` echoes it back. Replaces the whole schedule. Send exactly one of `timeslots` / `timeslots_local`."},"jitter_minutes":{"type":"integer","maximum":720.0,"minimum":0.0,"title":"Jitter Minutes","description":"Random +/- minutes applied to each slot (0-720). Defaults to 0.","default":0},"paused":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Paused","description":"Stop or resume posting without changing the schedule. true pauses it: no queued post publishes, and the timeslots and every queued post are kept exactly as they are. false resumes from the next upcoming slot. Omit it to leave the pause state alone — pausing is a separate axis from the cadence, so editing the slots does not resume a schedule someone deliberately stopped."}},"additionalProperties":false,"type":"object","title":"PostingScheduleUpdateRequest"},"PostsWithStatsResponse":{"properties":{"platform":{"type":"string","title":"Platform","description":"Platform where the posts live"},"account_id":{"type":"string","title":"Account Id","description":"Account ID"},"posts":{"items":{"$ref":"#/components/schemas/src__routes__integrations__socials__analytics__PostWithStats"},"type":"array","title":"Posts","description":"List of posts with their stats"}},"type":"object","required":["platform","account_id","posts"],"title":"PostsWithStatsResponse","description":"Response payload for posts with stats.","examples":[{"account_id":"ig-123","platform":"instagram","posts":[]}]},"PreflightResponse":{"properties":{"allowed":{"type":"boolean","title":"Allowed","description":"True when generation may proceed."},"blocker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blocker","description":"Stable code: 'generation_cap_reached' or 'no_photo_source'."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Plain, white-label-safe sentence to relay to the user."}},"type":"object","required":["allowed"],"title":"PreflightResponse","description":"Whether a generation may proceed, and what to ask the user for if not."},"PresignedUrlResponse":{"properties":{"url":{"type":"string","title":"Url","description":"Presigned URL for uploading files to S3"}},"type":"object","required":["url"],"title":"PresignedUrlResponse","description":"Response containing presigned URL.","examples":[{"url":"https://s3.amazonaws.com/bucket/file.jpg?X-Amz-Algorithm=..."}]},"ProjectSettings":{"properties":{"id":{"type":"string","title":"Id"},"aspect_ratio":{"type":"string","title":"Aspect Ratio"},"duration_limit_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Limit Seconds"}},"type":"object","required":["id","aspect_ratio"],"title":"ProjectSettings","description":"Project-level settings."},"PromptRequest":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"Primary prompt content"},"system_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt","description":"Optional system prompt to prepend"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Optional image URL included in the prompt for additional context"},"model":{"type":"string","title":"Model","description":"Model identifier in 'provider/model' format (e.g. 'openai/gpt-6-luna')","default":"openai/gpt-6-luna"},"max_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Tokens","description":"Maximum tokens for the response"},"temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature","description":"Sampling temperature (0-2)"},"run_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Name","description":"Optional run name for observability/tracing"},"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"Optional workspace identifier for observability"},"post_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Id","description":"Optional post identifier for observability"},"output_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Output Schema","description":"Optional JSON schema for structured responses"}},"type":"object","required":["prompt"],"title":"PromptRequest","examples":[{"business_id":"biz-123","model":"openai/gpt-6-luna","prompt":"Write a social media post about eco-friendly products"}]},"PromptResponse":{"properties":{"response":{"anyOf":[{"type":"string"},{"additionalProperties":true,"type":"object"}],"title":"Response","description":"AI response (string or structured dict if output_schema provided)"}},"type":"object","required":["response"],"title":"PromptResponse","examples":[{"response":"Here's a great eco-friendly product post for your social media..."}]},"ProrationPreviewRequest":{"properties":{"org_id":{"type":"string","title":"Org Id","description":"Organization ID"},"coupon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coupon","description":"Optional coupon code"}},"type":"object","required":["org_id"],"title":"ProrationPreviewRequest"},"ProrationPreviewResponse":{"properties":{"amount_due":{"type":"integer","title":"Amount Due","description":"Amount due in cents"},"currency":{"type":"string","title":"Currency","description":"Currency code (e.g. 'usd')"}},"type":"object","required":["amount_due","currency"],"title":"ProrationPreviewResponse"},"ProvisionBusinessContentRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID to provision content for"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url","description":"Business website URL to scrape"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Business description (used if no website)"},"creative_preferences":{"anyOf":[{"$ref":"#/components/schemas/CreativePreferences"},{"type":"null"}],"description":"Creative type distribution and aspect ratio"},"generate_posts":{"type":"boolean","title":"Generate Posts","description":"Whether to trigger post generation after setup","default":true},"onboarding_content_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Onboarding Content Types","description":"Content types selected during onboarding (e.g. ['ai_image', 'design', 'upload_photo'])"},"onboarding_aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Onboarding Aspect Ratio","description":"Aspect ratio selected during onboarding ('1:1' or '4:5')"},"source":{"type":"string","title":"Source","description":"Trigger source (onboarding, api, admin_script)","default":"onboarding"}},"type":"object","required":["business_id"],"title":"ProvisionBusinessContentRequest","description":"Input for provisioning content for an existing business (async)."},"ProvisionBusinessContentResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Async task ID to track provisioning progress"}},"type":"object","required":["task_id"],"title":"ProvisionBusinessContentResponse","description":"Response from async provisioning — returns immediately with task ID."},"ProvisioningRequest":{"properties":{"email":{"type":"string","title":"Email","description":"User's email address"},"given_name":{"type":"string","title":"Given Name","description":"User's first name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone","description":"User's phone number"},"business_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Name","description":"Business name (falls back to given_name)"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url","description":"Business website URL to scrape"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Business description (used if no website)"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id","description":"Existing org to add business to; creates new if None"},"generate_posts":{"type":"boolean","title":"Generate Posts","description":"Whether to trigger post generation after setup","default":true},"send_welcome_email":{"type":"boolean","title":"Send Welcome Email","description":"Whether to send a welcome email with magic link","default":false},"source":{"type":"string","title":"Source","description":"Provisioning trigger source (api, facebook_lead, admin_script)","default":"api"},"source_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id","description":"External ID for dedup (e.g., Facebook leadgen_id)"},"metadata":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Metadata","description":"Passthrough context (UTM params, referrer, etc.) — shown in Slack notification"}},"type":"object","required":["email","given_name"],"title":"ProvisioningRequest","description":"Input for provisioning a new business account."},"ProvisioningResult":{"properties":{"user_id":{"type":"string","title":"User Id","description":"Created or existing user ID"},"org_id":{"type":"string","title":"Org Id","description":"Created or existing org ID"},"business_id":{"type":"string","title":"Business Id","description":"Created business ID"},"status":{"type":"string","title":"Status","description":"Overall provisioning status","x-extensible-enum":["complete","partial"]},"steps_completed":{"items":{"type":"string"},"type":"array","title":"Steps Completed","description":"Steps that succeeded"},"steps_failed":{"items":{"type":"string"},"type":"array","title":"Steps Failed","description":"Steps that failed (with fallback)"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error details if status is partial"}},"type":"object","required":["user_id","org_id","business_id","status","steps_completed","steps_failed"],"title":"ProvisioningResult","description":"Output from provisioning."},"PublicBrandingResponse":{"properties":{"id":{"type":"string","title":"Id"},"domain":{"type":"string","title":"Domain"},"logo_url":{"type":"string","title":"Logo Url"},"primary_color":{"type":"string","title":"Primary Color"},"name":{"type":"string","title":"Name"},"is_platform":{"type":"boolean","title":"Is Platform","description":"True if this is the Marky platform, false for whitelabel portals","default":false}},"type":"object","required":["id","domain","logo_url","primary_color","name"],"title":"PublicBrandingResponse","description":"Public branding info returned on the unauthenticated by-domain endpoint."},"PublishFailure":{"properties":{"platform":{"type":"string","title":"Platform"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"error_classification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Classification"},"full_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Error"}},"type":"object","required":["platform"],"title":"PublishFailure"},"PublishFailureSmsRequest":{"properties":{"post_id":{"type":"string","title":"Post Id","description":"The post that failed to publish"},"business_id":{"type":"string","title":"Business Id","description":"The business that owns the post"},"failed_platforms":{"items":{"type":"string"},"type":"array","title":"Failed Platforms","description":"Platform names that failed, e.g. ['facebook', 'instagram']"}},"type":"object","required":["post_id","business_id"],"title":"PublishFailureSmsRequest"},"PublishFailureSmsResponse":{"properties":{"sms_sent":{"type":"integer","title":"Sms Sent","description":"Number of SMS messages sent"}},"type":"object","required":["sms_sent"],"title":"PublishFailureSmsResponse"},"PublishPostBody":{"properties":{"platforms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Platforms"}},"type":"object","title":"PublishPostBody"},"PublishPostResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true}},"type":"object","title":"PublishPostResponse"},"PublishReadiness":{"properties":{"will_publish_to":{"items":{"type":"string"},"type":"array","title":"Will Publish To","description":"Platforms that will receive the post. Empty means nothing connected can publish it."},"blocked":{"items":{"$ref":"#/components/schemas/BlockedPlatform"},"type":"array","title":"Blocked","description":"Accounts the post was aimed at that won't receive it, each with the reason and fix."},"not_connected":{"items":{"type":"string"},"type":"array","title":"Not Connected","description":"Platforms the post was aimed at (via restrict_publish_to) that have no account connected. The post will NOT go to these. Connect the account, then schedule or update the post again."}},"type":"object","required":["will_publish_to"],"title":"PublishReadiness","description":"Where this post will actually go, worked out when it was queued, scheduled or published."},"PublishResultResponse":{"properties":{"platform":{"type":"string","title":"Platform","description":"Platform identifier (facebook, instagram, etc.)"},"status":{"type":"string","title":"Status","description":"Publish status on this platform: success, failed, in_progress, etc."},"publish_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publish Id","description":"External post ID on the platform — use with `GET /businesses/{business_id}/integrations/{integration_id}/posts/{external_post_id}/stats`"},"post_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Url","description":"Public URL of the published post on the platform"},"error_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Type","description":"Error type if status is failed (e.g. REFRESH_TOKEN_EXPIRED, TIMEOUT)"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Human-readable error message if status is failed"},"integration_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Integration Id","description":"The exact connected account this result belongs to. Distinguishes accounts when a business has several on one platform."},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"When this result was last updated"}},"type":"object","required":["platform","status"],"title":"PublishResultResponse"},"PublishStatusResponse":{"properties":{"results":{"additionalProperties":true,"type":"object","title":"Results"},"accounts":{"items":{"$ref":"#/components/schemas/AccountPublishStatus"},"type":"array","title":"Accounts","default":[]}},"type":"object","required":["results"],"title":"PublishStatusResponse"},"PublishingErrorRequest":{"properties":{"post_id":{"type":"string","title":"Post Id"},"business_id":{"type":"string","title":"Business Id"},"failures":{"items":{"$ref":"#/components/schemas/PublishFailure"},"type":"array","title":"Failures"}},"type":"object","required":["post_id","business_id","failures"],"title":"PublishingErrorRequest"},"PurchaseCreditsRequest":{"properties":{"org_id":{"type":"string","title":"Org Id","description":"Organization ID"},"quantity":{"type":"integer","title":"Quantity","description":"Number of credits to purchase"},"success_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Success Url","description":"URL to redirect after successful purchase"},"cancel_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Url","description":"URL to redirect if purchase is cancelled"}},"type":"object","required":["org_id","quantity"],"title":"PurchaseCreditsRequest","description":"Request to purchase credits.","examples":[{"cancel_url":"https://app.mymarky.ai/account/profile?purchase=cancelled","org_id":"org-123","quantity":150,"success_url":"https://app.mymarky.ai/account/profile?purchase=success"}]},"PurchaseCreditsResponse":{"properties":{"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"Stripe checkout session ID (if using checkout)"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Checkout URL (if using checkout)"},"payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Intent Id","description":"Payment intent ID (if charged directly)"},"quantity":{"type":"integer","title":"Quantity","description":"Number of credits purchased"},"price_usd":{"type":"number","title":"Price Usd","description":"Total price in USD"},"charged_directly":{"type":"boolean","title":"Charged Directly","description":"Whether payment was charged directly to card on file","default":false}},"type":"object","required":["quantity","price_usd"],"title":"PurchaseCreditsResponse","description":"Response with Stripe checkout session details or direct charge result.","examples":[{"charged_directly":false,"price_usd":10.0,"quantity":150,"session_id":"cs_...","url":"https://checkout.stripe.com/pay/cs_..."}]},"PurchaseRequest":{"properties":{"transaction_jws":{"type":"string","title":"Transaction Jws"},"org_id":{"type":"string","title":"Org Id"}},"type":"object","required":["transaction_jws","org_id"],"title":"PurchaseRequest","description":"Signed StoreKit 2 transaction the mobile client just received."},"PurchaseResponse":{"properties":{"plan":{"type":"string","title":"Plan"},"provider":{"type":"string","title":"Provider"}},"type":"object","required":["plan","provider"],"title":"PurchaseResponse"},"PushPreferences":{"properties":{"post_updates":{"type":"boolean","title":"Post Updates","description":"Push when a post is published or fails.","default":true},"reminders":{"type":"boolean","title":"Reminders","description":"Comeback nudges after idle days.","default":true},"milestones":{"type":"boolean","title":"Milestones","description":"Streak celebrations on milestone days.","default":true},"low_scheduled":{"type":"boolean","title":"Low Scheduled","description":"Push when the scheduled queue is running low.","default":true}},"type":"object","title":"PushPreferences","description":"User-level push notification preferences.\n\nAll default to True (opted in). The mobile settings screen lets users\ntoggle individual categories off."},"QueryVideoRequest":{"properties":{"video_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Video Url","description":"URL of the video to query"},"prompt":{"type":"string","title":"Prompt","description":"Prompt for video query","default":"describe the video in detail"},"business_id":{"type":"string","title":"Business Id","description":"Business ID for task tracking"},"fps":{"type":"number","maximum":10.0,"minimum":0.1,"title":"Fps","description":"Frames per second for video sampling (default: 1.0)","default":1.0},"resolution":{"type":"string","enum":["low","medium","high"],"title":"Resolution","description":"Video resolution quality (default: medium)","default":"medium"},"model":{"type":"string","title":"Model","description":"Gemini model to use for video query (default: gemini-3-flash-preview)","default":"gemini-3-flash-preview","x-extensible-enum":["gemini-2.5-flash","gemini-3-flash-preview","gemini-3-pro-preview"]}},"type":"object","required":["video_url","business_id"],"title":"QueryVideoRequest","description":"Request to query a video."},"QueueInfo":{"properties":{"queue_id":{"type":"string","title":"Queue Id","description":"ID of the daily queue this post belongs to."},"position":{"type":"integer","format":"int32","title":"Position","description":"1-based rank among the queued posts (1 = next to publish)."},"estimated_publish_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Publish Time","description":"Best estimate of when this post will publish, projected from the queue's recurring timeslots. Ignores jitter and skipped slots, so treat it as approximate. Null if it can't be computed."},"estimated_publish_time_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Publish Time Local","description":"The same moment in the business's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting the UTC value."},"queue_runs_dry_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Queue Runs Dry At","description":"Estimated publish time of the LAST post in this queue: when it runs dry. Same estimate rules as estimated_publish_time."},"queue_runs_dry_at_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Queue Runs Dry At Local","description":"The same moment in the business's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting the UTC value."},"warnings":{"items":{"$ref":"#/components/schemas/FieldWarning"},"type":"array","title":"Warnings","description":"Advisory notes about WHEN this post goes out; they never block. DATE_BOUND_COPY: the caption says 'today', a weekday, 'this week'... and the post lands on a different day. FAR_FUTURE: it lands more than 90 days out. Quote them to the user."}},"type":"object","required":["queue_id","position"],"title":"QueueInfo","description":"Where a post sits in its business's recurring daily publishing queue.\n\nOnly present on posts that are in a queue (status SCHEDULED with no\n`adhoc_publish_time`). Lets an API user confirm a queued post is really\nqueued and see roughly when it will publish."},"QueueSummaryResponse":{"properties":{"queued_count":{"type":"integer","format":"int32","title":"Queued Count","description":"Number of posts waiting in the daily queue."},"next_estimated_publish_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Estimated Publish Time","description":"Estimated publish time of the NEXT queued post. Null when the queue is empty, no estimate can be computed, or the business has no connected account that can publish (the slot would pass with nothing going out)."},"last_estimated_publish_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Estimated Publish Time","description":"Estimated publish time of the LAST queued post — i.e. when the queue runs dry. Null when the queue is empty, no estimate can be computed, or the business has no connected account that can publish."}},"type":"object","required":["queued_count"],"title":"QueueSummaryResponse","description":"Aggregate view of a business's daily queue — \"how full is my queue?\" in one cheap call."},"QueuedPostResponse":{"properties":{"post_id":{"type":"string","title":"Post Id","description":"The queued post's ID"},"queue_id":{"type":"string","title":"Queue Id","description":"ID of the daily queue this post belongs to."},"caption_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Preview","description":"First ~140 characters of the caption."},"restrict_publish_to":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Restrict Publish To","description":"Platforms this post is restricted to. Null means ALL connected platforms."},"position":{"type":"integer","format":"int32","title":"Position","description":"1-based rank in the queue (1 = next to publish)."},"estimated_publish_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Publish Time","description":"Best estimate of when this post will publish, projected from the queue's recurring timeslots. Approximate (ignores jitter/skips). Null if it can't be computed."},"estimated_publish_time_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Publish Time Local","description":"The same moment in the business's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting the UTC value."},"warnings":{"items":{"$ref":"#/components/schemas/FieldWarning"},"type":"array","title":"Warnings","description":"Advisory notes about when this post goes out (same codes as a post's queue.warnings). Never blocking."}},"type":"object","required":["post_id","queue_id","position"],"title":"QueuedPostResponse","description":"One entry in a business's daily queue listing."},"QueuedPostsPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/QueuedPostResponse"},"type":"array","title":"Items","description":"This page of results."},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next","description":"Opaque cursor for the next page; null when there are no more. Pass it back verbatim as ?cursor=. Do not construct or decode it."},"summary":{"$ref":"#/components/schemas/QueueSummaryResponse","description":"Aggregate fullness of the entire queue (all pages), identical to the get_queue_summary response."}},"type":"object","required":["items","summary"],"title":"QueuedPostsPage","description":"The queued-posts listing plus the same aggregate `summary` block.\n\nBundles in what `get_queue_summary` returns, so a caller paging the queue can\nsee \"how full is it / when does it run dry\" without a second round-trip. Keeps\nthe standard Page shape (`items` + `next`) and just ADDS `summary`; the summary\ncounts the WHOLE queue, not just this page."},"RSSItem":{"properties":{"title":{"type":"string","title":"Title"},"url":{"type":"string","title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"published":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published"}},"type":"object","required":["title","url"],"title":"RSSItem"},"RateSkillRunRequest":{"properties":{"thread_id":{"type":"string","minLength":1,"title":"Thread Id","description":"The chat thread the skill ran in. We rate the most recent skill_runs row for this thread (the frontend never sees the run id)."},"rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Rating","description":"Quality rating 1-5. The chat UI maps thumbs down -> 1, thumbs up -> 5."},"review_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Text","description":"Optional free-text comment from the user."}},"type":"object","required":["thread_id","rating"],"title":"RateSkillRunRequest","description":"A user's quality rating for the skill run they just saw finish."},"RateSkillRunResponse":{"properties":{"rated":{"type":"boolean","title":"Rated","description":"True if a skill run was found and rated; False if this thread had no skill run to rate (the UI then just hides the prompt)."},"skill_run_id":{"type":"string","title":"Skill Run Id","description":"The rated skill_runs row id (empty when rated=False).","default":""}},"type":"object","required":["rated"],"title":"RateSkillRunResponse","description":"Result of recording a user rating."},"RatingMemorySuggestion":{"properties":{"id":{"type":"string","title":"Id","description":"memory_suggestions row id; accept/dismiss it by this id"},"suggestion":{"type":"string","title":"Suggestion","description":"The sentence the owner reads"}},"additionalProperties":false,"type":"object","required":["id","suggestion"],"title":"RatingMemorySuggestion","description":"A preference card the rating comment completed, shown on the rating card."},"ReadFileRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID"},"path":{"type":"string","minLength":1,"title":"Path","description":"Full file path (must start with '/', e.g. '/documents/report.md')"}},"type":"object","required":["business_id","path"],"title":"ReadFileRequest","description":"Request to read a file resource by its full path.","examples":[{"business_id":"biz-123","path":"/documents/report.md"}]},"ReadFileResponse":{"properties":{"kind":{"type":"string","enum":["file","folder"],"title":"Kind","description":"'file' when `body` holds a document's text. 'folder' when the path was a folder with no single obvious document in it: `children` lists what is inside and `body` is empty.","default":"file"},"body":{"type":"string","title":"Body","description":"File contents (markdown body text). Empty for a folder.","default":""},"resolved_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolved Path","description":"Set when the path was a folder and its one document was read instead (e.g. '/brand.pdf' -> '/brand.pdf/brand'). Use this path to edit or cite the file."},"children":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Children","description":"Only when kind='folder': full paths of everything inside it, nested folders marked ' (folder)'. Read one of them next."},"attached_images":{"items":{"$ref":"#/components/schemas/AttachedImage"},"type":"array","title":"Attached Images","description":"Images attached to the file (media_id + url + alt)"}},"type":"object","title":"ReadFileResponse","description":"Response from reading a file (or a folder, which lists its children)."},"RecipeCreateRequest":{"properties":{"name":{"type":"string","title":"Name","description":"Recipe name"},"saved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Saved","description":"Whether the preset is saved/pinned."},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt","description":"Freeform brief the preset generates from."},"creative_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creative Type","description":"Default creative type (e.g. 'design', 'carousel', 'meme')."},"template_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Template Ids","description":"Templates the preset generates with."},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"Aspect ratio, e.g. '1:1', '9:16', '4:5'."},"palettes":{"anyOf":[{"items":{"$ref":"#/components/schemas/Palette"},"type":"array"},{"type":"null"}],"title":"Palettes","description":"Color palettes for generated designs."},"voice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice","description":"Brand voice override for this preset."},"caption_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Suffix","description":"Text appended to every generated caption."},"caption_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Instructions","description":"Extra caption-writing instructions."},"custom_caption_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Caption Prompt","description":"Custom caption-generation prompt."},"custom_meme_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Meme Prompt","description":"Custom meme-generation prompt."},"custom_carousel_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Carousel Prompt","description":"Custom carousel-generation prompt."},"ctas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ctas","description":"Call-to-action phrases for designs."},"include_stock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Stock","description":"Whether stock photos may be used."},"logo_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Logo Enabled","description":"Whether the logo is placed on designs."},"header_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Headline font."},"body_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Body font."},"audio_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Audio Tags","description":"Audio tags for video generation."},"ai_image_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Image Model","description":"AI image model to use."},"post_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Post Count","description":"How many posts a run generates."},"auto_context_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Context Enabled","description":"Whether auto-context is on."}},"additionalProperties":false,"type":"object","required":["name"],"title":"RecipeCreateRequest"},"RecipeResponse":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Recipe name."},"saved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Saved","description":"Whether the preset is saved/pinned."},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt","description":"Freeform brief the preset generates from."},"creative_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creative Type","description":"Default creative type (e.g. 'design', 'carousel', 'meme')."},"template_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Template Ids","description":"Templates the preset generates with."},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"Aspect ratio, e.g. '1:1', '9:16', '4:5'."},"palettes":{"anyOf":[{"items":{"$ref":"#/components/schemas/Palette"},"type":"array"},{"type":"null"}],"title":"Palettes","description":"Color palettes for generated designs."},"voice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice","description":"Brand voice override for this preset."},"caption_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Suffix","description":"Text appended to every generated caption."},"caption_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Instructions","description":"Extra caption-writing instructions."},"custom_caption_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Caption Prompt","description":"Custom caption-generation prompt."},"custom_meme_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Meme Prompt","description":"Custom meme-generation prompt."},"custom_carousel_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Carousel Prompt","description":"Custom carousel-generation prompt."},"ctas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ctas","description":"Call-to-action phrases for designs."},"include_stock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Stock","description":"Whether stock photos may be used."},"logo_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Logo Enabled","description":"Whether the logo is placed on designs."},"header_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Headline font."},"body_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Body font."},"audio_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Audio Tags","description":"Audio tags for video generation."},"ai_image_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Image Model","description":"AI image model to use."},"post_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Post Count","description":"How many posts a run generates."},"auto_context_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Context Enabled","description":"Whether auto-context is on."},"id":{"type":"string","title":"Id","description":"Recipe ID"},"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"Business this recipe belongs to"},"created_at":{"type":"string","title":"Created At","description":"When the recipe was created"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update time"}},"type":"object","required":["id","created_at"],"title":"RecipeResponse"},"RecipeUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Recipe name."},"saved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Saved","description":"Whether the preset is saved/pinned."},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt","description":"Freeform brief the preset generates from."},"creative_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creative Type","description":"Default creative type (e.g. 'design', 'carousel', 'meme')."},"template_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Template Ids","description":"Templates the preset generates with."},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"Aspect ratio, e.g. '1:1', '9:16', '4:5'."},"palettes":{"anyOf":[{"items":{"$ref":"#/components/schemas/Palette"},"type":"array"},{"type":"null"}],"title":"Palettes","description":"Color palettes for generated designs."},"voice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice","description":"Brand voice override for this preset."},"caption_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Suffix","description":"Text appended to every generated caption."},"caption_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Instructions","description":"Extra caption-writing instructions."},"custom_caption_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Caption Prompt","description":"Custom caption-generation prompt."},"custom_meme_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Meme Prompt","description":"Custom meme-generation prompt."},"custom_carousel_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Carousel Prompt","description":"Custom carousel-generation prompt."},"ctas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ctas","description":"Call-to-action phrases for designs."},"include_stock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Stock","description":"Whether stock photos may be used."},"logo_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Logo Enabled","description":"Whether the logo is placed on designs."},"header_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Headline font."},"body_font":{"anyOf":[{"$ref":"#/components/schemas/FontSetting"},{"type":"null"}],"description":"Body font."},"audio_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Audio Tags","description":"Audio tags for video generation."},"ai_image_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Image Model","description":"AI image model to use."},"post_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Post Count","description":"How many posts a run generates."},"auto_context_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Context Enabled","description":"Whether auto-context is on."}},"additionalProperties":false,"type":"object","title":"RecipeUpdateRequest"},"RecutVideoRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID for storage organization"},"video_url":{"type":"string","title":"Video Url","description":"URL of the video to recut"},"keep_ranges":{"items":{"$ref":"#/components/schemas/TimeRange"},"type":"array","title":"Keep Ranges","description":"Stretches of the SOURCE video to keep, in seconds, in order. These are cut together back to back, so they do not need to be adjacent.\n\nPick 3-5 SEPARATE ranges that tell a whole story, not one long stretch. A single contiguous chunk of the end gives the payoff with no setup and usually opens mid-sentence. Aim for: the hook (why the viewer should care), the one or two moments that carry it, the payoff or result, and the closing line if there is one.\n\nStart and end every range on a COMPLETE thought, using the transcript's sentence boundaries. Silence inside a range is removed automatically, so give whole beats and never try to trim pauses yourself. Total the kept ranges to a little OVER the length asked for, since removing silence shortens the result.\n\nFor footage with no speech (music, b-roll, dance), silence is not removed and the ranges are used exactly as given, so ask for the length you actually want."},"aspect_ratio":{"type":"string","title":"Aspect Ratio","description":"Output aspect ratio","default":"9:16"},"captions":{"type":"boolean","title":"Captions","description":"Burn in word-by-word captions. Set this to false for footage with no speech -- captions need word timings, and there are none.","default":true},"caption_style":{"type":"string","enum":["bold","glow","classic"],"title":"Caption Style","description":"Caption look. 'bold' is big all-caps with a yellow highlight on the spoken word, the standard short-form treatment. 'glow' is 'bold' with a neon cyan highlight and a soft glow, for dark or moody footage. 'classic' sets dark sentence-case text on a light rounded card, which reads over any footage without needing an outline.","default":"bold"},"text_overlays":{"items":{"$ref":"#/components/schemas/TitleOverlay"},"type":"array","title":"Text Overlays","description":"Titles to show on the finished cut, e.g. 'Artist Takeover' in teal with a black outline from 9.0s to 9.8s. Times are seconds on the CUT, not the source. A title that starts after the cut ends is refused with a 422 rather than silently left out."}},"type":"object","required":["business_id","video_url","keep_ranges"],"title":"RecutVideoRequest","description":"Request to cut a long clip down to a short captioned one."},"RedeemCodeRequest":{"properties":{"code":{"type":"string","title":"Code","description":"The one-time code from the magic link email"}},"type":"object","required":["code"],"title":"RedeemCodeRequest","description":"Request body for redeeming a one-time code."},"RedeemCodeResponse":{"properties":{"token":{"type":"string","title":"Token","description":"JWT token for authenticating subsequent requests"},"user_id":{"type":"string","title":"User Id","description":"The authenticated user's ID"}},"type":"object","required":["token","user_id"],"title":"RedeemCodeResponse","description":"Response after successfully redeeming a one-time code."},"ReferenceImage":{"properties":{"url":{"type":"string","title":"Url"},"options":{"additionalProperties":true,"type":"object","title":"Options","default":{}}},"type":"object","required":["url"],"title":"ReferenceImage","description":"Reference image for video generation.\n\nUsed to provide style references, character/object consistency, etc.\nModel-specific options are passed via the `options` dict.\n\nVendor-specific options:\n- Kling O1:\n    - reference_angles: list[str] - Additional angle URLs for element consistency\n      If provided, this image becomes an \"element\" with identity preservation\n- Veo (future):\n    - type: str - Image type enum (once supported)\n\nExample:\n    # Simple style reference\n    ReferenceImage(url=\"https://example.com/style.jpg\")\n\n    # Kling element with multiple angles\n    ReferenceImage(\n        url=\"https://example.com/character-front.jpg\",\n        options={\"reference_angles\": [\"https://example.com/character-side.jpg\"]}\n    )"},"RefreshRequest":{"properties":{"period_start":{"type":"string","format":"date","title":"Period Start","description":"Start of the period (YYYY-MM-DD). Max 90 days ago."},"period_end":{"type":"string","format":"date","title":"Period End","description":"End of the period (YYYY-MM-DD). Must be >= period_start."},"compare_to_previous":{"type":"boolean","title":"Compare To Previous","description":"If true, also query the immediately preceding period of equal length and include per-workspace previous_totals plus a period_progress fraction so the frontend can render delta chips.","default":false},"skip_sync":{"type":"boolean","title":"Skip Sync","description":"If true, skip the ETL sync and just query cached data. Use when the on-demand sync-if-stale hook handles freshness.","default":false}},"type":"object","required":["period_start","period_end"],"title":"RefreshRequest"},"RefreshUrlsRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MediaUrlRefreshItem"},"type":"array","maxItems":100,"title":"Items","description":"Posts whose cached media_url should be refreshed. Server fans out to the Graph API per-item with no bound on concurrency — the per-user IG token budget (~200/hr) is the real cap, and a single learn-from-socials run is well under it."}},"type":"object","required":["items"],"title":"RefreshUrlsRequest"},"RefreshUrlsResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/MediaUrlRefreshResult"},"type":"array","title":"Results","description":"One entry per input item, in input order. `media_url=null` means the platform doesn't expose a re-fetchable URL (Facebook, TikTok), the post no longer has video media, or the refresh failed — see `error`."}},"type":"object","required":["results"],"title":"RefreshUrlsResponse"},"RegisterPushDeviceRequest":{"properties":{"device_token":{"type":"string","minLength":1,"title":"Device Token","description":"APNs device token (hex), FCM registration ID, or VAPID endpoint."},"platform":{"type":"string","title":"Platform","description":"Target push network: 'ios' for APNs, 'android' for FCM, 'web' for VAPID.","x-extensible-enum":["ios","android","web"]},"bundle_id":{"type":"string","minLength":1,"title":"Bundle Id","description":"App bundle ID (e.g. 'ai.mymarky.app') for native, or an origin string for web push."},"p256dh":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"P256Dh","description":"Web push only: PushSubscription.getKey('p256dh'), base64url. Required when platform='web' — payloads cannot be encrypted without it."},"auth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth","description":"Web push only: PushSubscription.getKey('auth'), base64url. Required when platform='web'."}},"type":"object","required":["device_token","platform","bundle_id"],"title":"RegisterPushDeviceRequest"},"RegisterPushDeviceResponse":{"properties":{"id":{"type":"string","title":"Id","description":"push_subscriptions row UUID."}},"type":"object","required":["id"],"title":"RegisterPushDeviceResponse"},"RemoveBackgroundRequest":{"properties":{"image_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Image Url","description":"URL of the image to process"}},"type":"object","required":["image_url"],"title":"RemoveBackgroundRequest","description":"Request to remove background from an image.","examples":[{"image_url":"https://example.com/image.jpg"}]},"RemoveBackgroundResponse":{"properties":{"image_url":{"type":"string","title":"Image Url","description":"S3 URL of image with background removed"}},"type":"object","required":["image_url"],"title":"RemoveBackgroundResponse","description":"Response with processed image URL.","examples":[{"image_url":"https://s3.amazonaws.com/bucket/no-bg-image.png"}]},"RemoveFileRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID"},"path":{"type":"string","title":"Path","description":"Full file or directory path (must start with '/')"},"recursive":{"type":"boolean","title":"Recursive","description":"If True, recursively delete directory contents","default":false}},"type":"object","required":["business_id","path"],"title":"RemoveFileRequest","description":"Request to remove a file or directory.","examples":[{"business_id":"biz-123","path":"/documents/notes.md"},{"business_id":"biz-123","path":"/documents/old_folder","recursive":true}]},"RemoveFileResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the operation succeeded"},"message":{"type":"string","title":"Message","description":"Success or error message"}},"type":"object","required":["success","message"],"title":"RemoveFileResponse","description":"Response from file removal."},"RenderSettings":{"properties":{"preset":{"anyOf":[{"type":"string","enum":["tiktok_vertical","youtube_landscape","default"]},{"type":"null"}],"title":"Preset"},"output_format":{"type":"string","enum":["mp4","mov"],"title":"Output Format"},"target_fps":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Fps"},"video_bitrate_kbps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Video Bitrate Kbps"},"audio_bitrate_kbps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audio Bitrate Kbps"},"video_audio_volume_db":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Video Audio Volume Db","description":"Volume adjustment in dB for original video audio when mixing with audio tracks. Negative values reduce volume."}},"type":"object","required":["output_format"],"title":"RenderSettings","description":"Render/output settings."},"RendererFreshness":{"properties":{"live_sha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Live Sha","description":"GIT_SHA on the live Lambda, if it has one"},"backend_sha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backend Sha","description":"Commit this backend is running, if it knows"},"is_stale":{"type":"boolean","title":"Is Stale","description":"True when the renderer is provably NOT on the backend's commit"},"detail":{"type":"string","title":"Detail","description":"Plain sentence naming what was found"}},"type":"object","required":["is_stale","detail"],"title":"RendererFreshness","description":"What the live renderer is running, next to what this backend is running."},"ReplaceSample":{"properties":{"id":{"type":"string","title":"Id"},"before":{"type":"string","title":"Before","description":"The text around the first match, as it is now."},"after":{"type":"string","title":"After","description":"The same text after the replace."}},"type":"object","required":["id","before","after"],"title":"ReplaceSample"},"ReplyRequest":{"properties":{"reply_text":{"type":"string","maxLength":4096,"title":"Reply Text","description":"Reply text content (max 4096 bytes per GMB API)"}},"type":"object","required":["reply_text"],"title":"ReplyRequest","description":"Request to reply to a review.","examples":[{"reply_text":"Thank you for your feedback! We appreciate your business."}]},"ReplyToCommentRequest":{"properties":{"business_id":{"type":"string","title":"Business Id"},"reply_text":{"type":"string","maxLength":2200,"title":"Reply Text"},"platform":{"type":"string","title":"Platform","default":"facebook"},"integration_id":{"type":"string","title":"Integration Id"}},"type":"object","required":["business_id","reply_text","integration_id"],"title":"ReplyToCommentRequest"},"ReplyToReviewRequest":{"properties":{"reply_text":{"type":"string","maxLength":4096,"minLength":1,"title":"Reply Text","description":"The full public reply, exactly as the owner should see it on the approval card. Max 4096 characters."},"replace_existing":{"type":"boolean","title":"Replace Existing","description":"Only true when the owner explicitly asked to REPLACE a reply that is already there. Leave false: a review that already has a reply is refused with 409 REVIEW_ALREADY_REPLIED, so the owner's own words are never overwritten by accident.","default":false},"reviewer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewer Name","description":"The reviewer's name as list_google_reviews returned it. Shown on the approval card and checked against Google before posting."},"rating":{"anyOf":[{"type":"integer","maximum":5.0,"minimum":1.0},{"type":"null"}],"title":"Rating","description":"The review's star rating (1-5). Shown on the card and checked."}},"type":"object","required":["reply_text"],"title":"ReplyToReviewRequest","description":"Max's reply to one Google review. Every field is re-checked against Google."},"ResolveRequest":{"properties":{"permalink":{"type":"string","title":"Permalink","description":"The platform permalink, e.g. https://www.tiktok.com/@user/video/123"}},"type":"object","required":["permalink"],"title":"ResolveRequest"},"ResolveResponse":{"properties":{"media_url":{"type":"string","title":"Media Url","description":"Public Supabase Storage URL for the cached mp4. Stable for the lifetime of the cache object (we de-dup by permalink hash). Caller should consume immediately and not store the URL long-term — cache may be evicted."}},"type":"object","required":["media_url"],"title":"ResolveResponse"},"ResolvedParsedBrief":{"properties":{"idea":{"type":"string","title":"Idea","description":"The core post idea, stripped of formatting/style instructions"},"creative_format":{"anyOf":[{"type":"string","x-extensible-enum":["design","carousel","meme","image","gif","video","ai-image","ai-video"]},{"type":"null"}],"title":"Creative Format","description":"Inferred format: 'design' (image), 'video', 'carousel', 'meme', 'gif', or None if not specified"},"audio_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Audio Tags","description":"Music mood/genre if mentioned (e.g. ['jazz', 'upbeat'])"},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"Aspect ratio if mentioned (e.g. '9:16' for story/reel, '1:1' for square)"},"post_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Post Count","description":"Number of posts/variations if mentioned"},"defaults_applied":{"type":"boolean","title":"Defaults Applied","description":"True when business defaults were used to fill nulls","default":false}},"type":"object","required":["idea"],"title":"ResolvedParsedBrief","description":"ParsedBrief with defaults filled in from business profile."},"ResourceRecord":{"properties":{"id":{"type":"string","title":"Id"},"business_id":{"type":"string","title":"Business Id"},"body_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Text"}},"type":"object","required":["id","business_id"],"title":"ResourceRecord","description":"Minimal resource record for webhook payloads."},"ResourceSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"path":{"type":"string","title":"Path"},"summary":{"type":"string","title":"Summary"},"resource_type":{"type":"string","title":"Resource Type"}},"type":"object","required":["id","name","path","summary","resource_type"],"title":"ResourceSummary","description":"Resource summary from fast-backend API.\n\nNote: This receives already-validated data from the API,\nso resource_type is already a string (not a nested object)."},"ResourceTypeUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Resource type name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Resource type description"},"schema_definition":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Schema Definition","description":"JSON schema definition for the resource type"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon","description":"Icon identifier (e.g., 'TagOutlined')"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color","description":"Color hex code (e.g., '#faad14')"}},"type":"object","title":"ResourceTypeUpdate","description":"Request to update a resource type.","examples":[{"name":"Custom Event","schema_definition":{"properties":{},"type":"object"}}]},"ResourceWebhookPayload":{"properties":{"type":{"type":"string","title":"Type"},"table":{"type":"string","title":"Table"},"schema_name":{"type":"string","title":"Schema Name"},"record":{"$ref":"#/components/schemas/ResourceRecord"},"old_record":{"anyOf":[{"$ref":"#/components/schemas/ResourceRecord"},{"type":"null"}]}},"type":"object","required":["type","table","schema_name","record"],"title":"ResourceWebhookPayload"},"RestoreRequest":{"properties":{"transaction_jws_list":{"items":{"type":"string"},"type":"array","title":"Transaction Jws List"},"org_id":{"type":"string","title":"Org Id"}},"type":"object","required":["transaction_jws_list","org_id"],"title":"RestoreRequest","description":"One or more signed transactions from ``Transaction.currentEntitlements``.\n\nClient sends every active entitlement; server picks the most recent one\nthat maps to a known plan and applies it. Sending an empty list is fine —\nserver returns ``restored=False`` and the client shows \"no active\nsubscription to restore\"."},"RestoreResponse":{"properties":{"restored":{"type":"boolean","title":"Restored"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"}},"type":"object","required":["restored","plan"],"title":"RestoreResponse"},"RevertOutcome":{"type":"string","enum":["REVERTED","QUEUE_POSITION_CHANGED","CHANGED_SINCE","POST_ALREADY_PUBLISHED","SCHEDULE_TIME_PASSED","NOT_FOUND","NOT_REVERTIBLE"],"title":"RevertOutcome","description":"What happened to one record when a revision was reverted."},"RevertResult":{"properties":{"revision_id":{"type":"string","title":"Revision Id","description":"The revision you asked to revert."},"resource":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource","description":"What it changed: 'post', 'business', 'topic', ... Null when the revision was not found."},"record_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Record Id","description":"Id of the record it changed."},"outcome":{"$ref":"#/components/schemas/RevertOutcome","description":"REVERTED: put back exactly. QUEUE_POSITION_CHANGED: put back in the queue, at the end of the line. CHANGED_SINCE: someone edited it afterwards, left alone. POST_ALREADY_PUBLISHED: it already went out, left alone. SCHEDULE_TIME_PASSED: the old schedule time is in the past, left unscheduled. NOT_FOUND: no such revision in this business, or the record is gone. NOT_REVERTIBLE: this kind of change cannot be undone (a deleted post)."},"new_revision_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Revision Id","description":"The revision this revert itself wrote. Revert THAT to redo the change."}},"type":"object","required":["revision_id","outcome"],"title":"RevertResult","description":"What one revision's revert did (also the receipt data for the Undo chip)."},"RevertRevisionsRequest":{"properties":{"revision_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":100,"title":"Revision Ids","description":"The revision_id values from earlier write responses to undo."},"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"The business the revisions belong to. Defaults to the X-Business-Id header."}},"additionalProperties":false,"type":"object","required":["revision_ids"],"title":"RevertRevisionsRequest"},"RevertRevisionsResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/RevertResult"},"type":"array","title":"Results","description":"One entry per revision, in the order you sent them."}},"type":"object","required":["results"],"title":"RevertRevisionsResponse"},"ReviewPointer":{"properties":{"review_id":{"type":"string","title":"Review Id"},"reviewer_name":{"type":"string","title":"Reviewer Name"},"rating":{"type":"integer","title":"Rating"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["review_id","reviewer_name","rating","updated_at"],"title":"ReviewPointer","description":"One review the item is about, so Max can reply without re-listing."},"ReviewReplyReceipt":{"properties":{"review_id":{"type":"string","title":"Review Id","description":"The review that was replied to"},"reviewer_name":{"type":"string","title":"Reviewer Name","description":"Who wrote the review (Google's copy)"},"rating":{"type":"integer","title":"Rating","description":"The review's star rating, 1-5 (Google's copy)"},"reply_text":{"type":"string","title":"Reply Text","description":"The reply now public on Google, verbatim"},"replied_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replied At","description":"When Google recorded the reply (RFC 3339)"}},"type":"object","required":["review_id","reviewer_name","rating","reply_text","replied_at"],"title":"ReviewReplyReceipt","description":"What reply_to_review hands back: enough for Max to say what it posted."},"ReviewReplyResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether operation succeeded"},"reply_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply Text","description":"Reply text"},"reply_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply Time","description":"Reply update time"}},"type":"object","required":["success"],"title":"ReviewReplyResponse","description":"Response for reply operations."},"ReviewResponse":{"properties":{"review_id":{"type":"string","title":"Review Id","description":"Stable Google identifier for this review"},"reviewer_name":{"type":"string","title":"Reviewer Name","description":"Display name of the person who left the review"},"reviewer_photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewer Photo Url","description":"Reviewer's profile photo URL, if Google provides one"},"rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Rating","description":"Star rating from 1 (worst) to 5 (best)"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text","description":"The review comment. Null for star-only reviews with no written text."},"created_at":{"type":"string","title":"Created At","description":"When the review was first posted (ISO 8601 / RFC 3339 timestamp)"},"updated_at":{"type":"string","title":"Updated At","description":"When the review was last edited (ISO 8601 / RFC 3339 timestamp)"},"has_reply":{"type":"boolean","title":"Has Reply","description":"Whether the business has publicly replied to this review"},"reply_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply Text","description":"The business's public reply, if any"},"reply_updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply Updated At","description":"When the business's reply was last updated (ISO 8601), if any"},"needs_reply":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Needs Reply","description":"True when the review is rated 3 stars or less and has no reply yet: it is waiting on the owner. Omitted when this workspace does not have the feature."}},"type":"object","required":["review_id","reviewer_name","rating","created_at","updated_at","has_reply"],"title":"ReviewResponse","description":"A single Google Business review, plus the business's reply if it has one.\n\nThis is a deliberately small, stable projection of Google's raw review\nobject — we only surface the fields an agent needs (who, how many stars,\nwhat they said, when, and our reply). Google's internal field names\n(reviewer.profilePhotoUrl, the starRating enum, reviewReply, etc.) are NOT\nleaked; they are mapped to plain snake_case here."},"ReviewWithMetadata":{"properties":{"review_id":{"type":"string","title":"Review Id","description":"Unique review identifier"},"author_name":{"type":"string","title":"Author Name","description":"Review author name"},"author_photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Photo Url","description":"Author profile photo URL"},"star_rating":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Star Rating","description":"Star rating 1-5"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment","description":"Review text"},"create_time":{"type":"string","title":"Create Time","description":"When review was created"},"update_time":{"type":"string","title":"Update Time","description":"When review was last updated"},"has_reply":{"type":"boolean","title":"Has Reply","description":"Whether business has replied"},"reply_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply Text","description":"Business reply text"},"reply_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply Time","description":"When business replied"}},"type":"object","required":["review_id","author_name","star_rating","create_time","update_time","has_reply"],"title":"ReviewWithMetadata","description":"Review with additional metadata."},"RuleMatch":{"properties":{"q":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q","description":"Optional keyword search, as in list_posts. Posts must ALSO contain the find text."},"statuses":{"items":{"type":"string","enum":["NEW","DRAFT","REJECTED","SCHEDULED"]},"type":"array","minItems":1,"title":"Statuses","description":"Which posts to consider. Default: every unpublished status."}},"additionalProperties":false,"type":"object","title":"RuleMatch"},"RuleSet":{"properties":{"caption_replace":{"$ref":"#/components/schemas/CaptionReplace","description":"Replace the text in each matched post's caption and in every per-platform caption. Nothing else in the caption changes, and scheduling is never touched."}},"additionalProperties":false,"type":"object","required":["caption_replace"],"title":"RuleSet"},"RunCompleteResponse":{"properties":{"run_id":{"type":"string","title":"Run Id"},"status":{"type":"string","title":"Status"},"drafted_count":{"type":"integer","title":"Drafted Count"}},"type":"object","required":["run_id","status","drafted_count"],"title":"RunCompleteResponse"},"RunDueReport":{"properties":{"outcomes":{"items":{"$ref":"#/components/schemas/RunOutcome"},"type":"array","title":"Outcomes"}},"type":"object","required":["outcomes"],"title":"RunDueReport"},"RunOutcome":{"properties":{"schedule_id":{"type":"string","title":"Schedule Id"},"business_id":{"type":"string","title":"Business Id"},"run_id":{"type":"string","title":"Run Id"},"status":{"type":"string","title":"Status"},"skip_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skip Reason"}},"type":"object","required":["schedule_id","business_id","run_id","status"],"title":"RunOutcome","description":"What run-due did with one schedule it claimed."},"SaveOfferRequest":{"properties":{"org_id":{"type":"string","title":"Org Id"}},"additionalProperties":false,"type":"object","required":["org_id"],"title":"SaveOfferRequest","description":"Body for the cancel-flow save offers (pause / one-step downgrade)."},"SaveSkillRequest":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","description":"Slash command name (lowercase, hyphens, no spaces). e.g. \"weekly-posts\""},"description":{"type":"string","minLength":1,"title":"Description","description":"One-line description of what this skill does"},"instruction_md":{"type":"string","minLength":1,"title":"Instruction Md","description":"Markdown instructions following the Goal/Instructions format"}},"type":"object","required":["name","description","instruction_md"],"title":"SaveSkillRequest","description":"Request to save or update a business-owned skill (slash command)."},"SaveSkillResponse":{"properties":{"name":{"type":"string","title":"Name","description":"The saved skill's slash-command name (slug)"},"updated":{"type":"boolean","title":"Updated","description":"True if an existing business-owned skill was updated, False if a new one was created"},"message":{"type":"string","title":"Message","description":"Confirmation message to relay to the user"}},"type":"object","required":["name","updated","message"],"title":"SaveSkillResponse","description":"Result of a save_skill call."},"ScheduleItemError":{"properties":{"code":{"type":"string","enum":["NOT_FOUND","POST_ALREADY_PUBLISHED","ALREADY_SCHEDULED","NOT_SCHEDULABLE","CAPTION_HAS_PLACEHOLDER","NO_CONNECTED_SOCIALS","MEDIA_REQUIRED","TIME_IN_PAST","COPY_DATE_BEFORE_NEXT_SLOT"],"title":"Code","description":"NOT_FOUND: no such post in this business. POST_ALREADY_PUBLISHED: it already went out. ALREADY_SCHEDULED (queue mode): it is already on the calendar; nothing changed, and its current time is still returned. NOT_SCHEDULABLE: its status can't be scheduled (e.g. REJECTED). CAPTION_HAS_PLACEHOLDER: a [[placeholder]] is still unfilled. NO_CONNECTED_SOCIALS: nothing connected can publish it. MEDIA_REQUIRED: a target platform needs a photo or video. TIME_IN_PAST: `at` time has already passed. COPY_DATE_BEFORE_NEXT_SLOT: the caption names a day, the next queue slot is after it and that day's time has passed; ask the user (publish now, pick a time, or ignore_copy_date=true)."},"detail":{"type":"string","title":"Detail","description":"What happened, in plain words."},"recovery_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recovery Hint","description":"The next step that fixes it, when there is one."},"reconnect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reconnect Url","description":"Where the user reconnects accounts (NO_CONNECTED_SOCIALS)."},"copy_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Copy Date","description":"The day the caption names (COPY_DATE_BEFORE_NEXT_SLOT)."},"next_slot_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Slot Local","description":"Where the queue would have put it, local time (COPY_DATE_BEFORE_NEXT_SLOT)."}},"type":"object","required":["code","detail"],"title":"ScheduleItemError","description":"Why one post was not scheduled. The rest of the batch is unaffected."},"SchedulePostsRequest":{"properties":{"post_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":50,"minItems":1,"title":"Post Ids","description":"The posts to schedule, IN PUBLISH ORDER: in `queue` mode the first id gets the next open slot, the second the one after, and so on. Send the whole batch in one call; parallel single calls can't keep an order."},"mode":{"type":"string","enum":["queue","at"],"title":"Mode","description":"`queue` (default): append to the business's posting queue, in list order. A post that already carries a date (a pin) is scheduled at that date instead. `at`: publish each post at the matching `times_local`.","default":"queue"},"times_local":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Times Local","description":"`at` mode only, one per post id, in the same order. Wall-clock time in the business's timezone (or `timezone` below), e.g. `2026-10-05T09:00`. Never convert to UTC yourself; daylight saving is handled here."},"ignore_copy_date":{"type":"boolean","title":"Ignore Copy Date","description":"`queue` mode: queue posts even when the slot is after the day their caption names (COPY_DATE_BEFORE_NEXT_SLOT). Only when the user said so.","default":false},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"IANA timezone for `times_local`, e.g. `Australia/Melbourne`. Defaults to the business's calendar timezone. Answers are always shown on the same clock."}},"additionalProperties":false,"type":"object","required":["post_ids"],"title":"SchedulePostsRequest"},"SchedulePostsResponse":{"properties":{"timezone":{"type":"string","title":"Timezone","description":"IANA timezone of every `*_local` time here."},"timezone_source":{"type":"string","enum":["business","unset_utc"],"title":"Timezone Source","description":"`business`: the business's own setting. `unset_utc`: none saved, so times are UTC."},"results":{"items":{"$ref":"#/components/schemas/ScheduledPostResult"},"type":"array","title":"Results","description":"One entry per post id, in the order you sent them."},"queue":{"$ref":"#/components/schemas/ScheduleQueueSummary"}},"type":"object","required":["timezone","timezone_source","results","queue"],"title":"SchedulePostsResponse"},"ScheduleQueueSummary":{"properties":{"queued_count":{"type":"integer","format":"int32","title":"Queued Count","description":"Posts now waiting in the queue."},"runs_dry_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runs Dry At","description":"Estimated time of the LAST queued post."},"runs_dry_at_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runs Dry At Local","description":"The same moment in the business's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting the UTC value."}},"type":"object","required":["queued_count"],"title":"ScheduleQueueSummary","description":"The business's queue after this call, so no extra read is needed."},"ScheduledPostResult":{"properties":{"post_id":{"type":"string","title":"Post Id"},"ok":{"type":"boolean","title":"Ok","description":"True when this call scheduled the post."},"placement":{"anyOf":[{"type":"string","enum":["queue","pin","at","copy_date"]},{"type":"null"}],"title":"Placement","description":"`queue`: in the posting queue. `pin`: at the date it already carried. `at`: at the time you asked for."},"position":{"anyOf":[{"type":"integer","format":"int32"},{"type":"null"}],"title":"Position","description":"Place in the queue (1 = next). Queue placement only."},"publish_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publish Time","description":"When it goes out (a queue time is an estimate from the posting schedule)."},"publish_time_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publish Time Local","description":"The same moment in the business's timezone, ready to show a person, e.g. \"Wed Sep 23, 6:00 PM MSK\". Quote it as-is instead of converting the UTC value."},"warnings":{"items":{"$ref":"#/components/schemas/FieldWarning"},"type":"array","title":"Warnings","description":"Advisory, never blocking; quote them to the user. DATE_BOUND_COPY: the caption says 'today'/a weekday/'this week' and lands on another day. FAR_FUTURE: lands more than 90 days out. SLOT_TAKEN: another post goes to the same account within 30 minutes. PIN_PASSED: its date had passed, so it was queued. QUEUE_PAUSED: the schedule is paused. SCHEDULED_ON_COPY_DATE: the caption names a day the next queue slot was past, so it was scheduled on that day. AFTER_COPY_DATE: it goes out after the day its caption names."},"error":{"anyOf":[{"$ref":"#/components/schemas/ScheduleItemError"},{"type":"null"}]},"revision_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revision Id","description":"Undo record for this post (revert_revisions)."},"publish_readiness":{"anyOf":[{"$ref":"#/components/schemas/PublishReadiness"},{"type":"null"}],"description":"Where it will and won't publish, when this call scheduled it."}},"type":"object","required":["post_id","ok"],"title":"ScheduledPostResult","description":"What happened to one post, in the order the ids were sent."},"SchemaUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Resource type name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Resource type description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon","description":"Icon identifier"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color","description":"Color hex code"},"extension":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extension","description":"File extension"},"schema":{"additionalProperties":true,"type":"object","title":"Schema","description":"JSON schema definition"},"explicit_renames":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Explicit Renames","description":"Map of old_key -> new_key for explicit field renames"}},"type":"object","required":["schema"],"title":"SchemaUpdateRequest","description":"Request to update a schema and migrate resources.","examples":[{"color":"#faad14","icon":"TagOutlined","name":"Updated Product","schema":{"properties":{},"type":"object"}}]},"SchemaUpdateResponse":{"properties":{"resource_type_id":{"type":"string","title":"Resource Type Id","description":"ID of the resource type that was updated"},"resources_migrated":{"type":"integer","title":"Resources Migrated","description":"Number of resources that were migrated"},"fields_deleted":{"items":{"type":"string"},"type":"array","title":"Fields Deleted","description":"List of field names that were deleted"},"fields_renamed":{"additionalProperties":{"type":"string"},"type":"object","title":"Fields Renamed","description":"Map of old field name -> new field name"},"fields_type_changed":{"additionalProperties":{"prefixItems":[{"type":"string"},{"type":"string"}],"type":"array","maxItems":2,"minItems":2},"type":"object","title":"Fields Type Changed","description":"Map of field name -> (old_type, new_type)"}},"type":"object","required":["resource_type_id","resources_migrated","fields_deleted","fields_renamed","fields_type_changed"],"title":"SchemaUpdateResponse","description":"Response with migration results.","examples":[{"fields_deleted":["old_field"],"fields_renamed":{},"fields_type_changed":{},"resource_type_id":"uuid","resources_migrated":5}]},"ScoreDimensions":{"properties":{"hook_caption":{"type":"integer","title":"Hook Caption","description":"How compelling is the first line of the caption (1-5)"},"hook_visual":{"type":"integer","title":"Hook Visual","description":"How scroll-stopping is the visual (1-5)"},"depth":{"type":"integer","title":"Depth","description":"Is the content substantive or generic filler (1-5)"},"design_text":{"type":"integer","title":"Design Text","description":"Text readability, fit, and layout (1-5)"},"design_photos":{"type":"integer","title":"Design Photos","description":"Photo cropping, positioning, and relevance (1-5)"},"overall":{"type":"number","title":"Overall","description":"Weighted overall score (1-5)"}},"additionalProperties":false,"type":"object","required":["hook_caption","hook_visual","depth","design_text","design_photos","overall"],"title":"ScoreDimensions"},"ScorePostResponse":{"properties":{"ai":{"$ref":"#/components/schemas/ScoreDimensions","description":"AI-generated quality scores"}},"additionalProperties":false,"type":"object","required":["ai"],"title":"ScorePostResponse"},"ScrapeResult":{"properties":{"markdown":{"type":"string","title":"Markdown"},"name":{"type":"string","title":"Name"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"screenshot_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot Url"}},"type":"object","required":["markdown","name"],"title":"ScrapeResult"},"ScrapeWebpageRequest":{"properties":{"url":{"type":"string","minLength":1,"title":"Url","description":"URL of the webpage to scrape"}},"type":"object","required":["url"],"title":"ScrapeWebpageRequest","description":"Request to scrape a single webpage."},"ScrapeWebsiteRequest":{"properties":{"url":{"type":"string","title":"Url","description":"URL to scrape"},"crawl":{"type":"boolean","title":"Crawl","description":"Whether to crawl multiple pages","default":false},"business_id":{"type":"string","title":"Business Id","description":"Business ID for task tracking"}},"type":"object","required":["url","business_id"],"title":"ScrapeWebsiteRequest"},"ScrapeWebsiteResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Async task ID to poll for results"}},"type":"object","required":["task_id"],"title":"ScrapeWebsiteResponse"},"SearchGifsRequest":{"properties":{"query":{"type":"string","minLength":1,"title":"Query","description":"Search query for GIFs (e.g., \"happy\", \"thank you\", \"celebration\")"},"limit":{"type":"integer","maximum":25.0,"minimum":1.0,"title":"Limit","description":"Maximum number of results to return (default: 10, max: 25)","default":10}},"type":"object","required":["query"],"title":"SearchGifsRequest","description":"Request to search Giphy for GIFs."},"SearchGifsResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/GiphyResult"},"type":"array","title":"Results","description":"List of matching GIF results"}},"type":"object","required":["results"],"title":"SearchGifsResponse","description":"Giphy search results."},"SearchKeywordsRequest":{"properties":{"caption":{"type":"string","title":"Caption","description":"Business description or caption text to extract keywords from"}},"type":"object","required":["caption"],"title":"SearchKeywordsRequest"},"SearchKeywordsResponse":{"properties":{"search_terms":{"items":{"type":"string"},"type":"array","title":"Search Terms","description":"3-5 image search keywords"}},"type":"object","required":["search_terms"],"title":"SearchKeywordsResponse"},"SearchMusicRequest":{"properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query","description":"Search query (searches title, description, tags)"},"tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tags","description":"Filter by specific tags"},"category":{"type":"string","title":"Category","description":"Audio category: 'music' or 'sound_effect'","default":"music"},"page":{"type":"integer","minimum":1.0,"title":"Page","description":"Page number","default":1},"page_size":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Page Size","description":"Results per page","default":20},"license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License","description":"Filter by license (e.g., 'cc0', 'by', 'by-sa')"},"license_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"License Type","description":"Filter by license type ('commercial', 'modification')"}},"type":"object","title":"SearchMusicRequest","description":"Request to search for music/audio on Openverse."},"SearchMusicResponse":{"properties":{"count":{"type":"integer","title":"Count","description":"Total number of results"},"page":{"type":"integer","title":"Page","description":"Current page number"},"page_size":{"type":"integer","title":"Page Size","description":"Results per page"},"page_count":{"type":"integer","title":"Page Count","description":"Total number of pages"},"results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Results","description":"Audio results with id, title, url, creator, tags, duration, license, source"}},"type":"object","required":["count","page","page_size","page_count","results"],"title":"SearchMusicResponse","description":"Response from music search.","examples":[{"count":50,"page":1,"page_count":3,"page_size":20,"results":[]}]},"SearchNewsRequest":{"properties":{"query":{"type":"string","minLength":1,"title":"Query","description":"Search query for news"},"max_results":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Max Results","default":10}},"type":"object","required":["query"],"title":"SearchNewsRequest"},"SearchNewsResponse":{"properties":{"articles":{"items":{"$ref":"#/components/schemas/NewsArticle"},"type":"array","title":"Articles"}},"type":"object","required":["articles"],"title":"SearchNewsResponse"},"SearchStockRequest":{"properties":{"query":{"type":"string","minLength":1,"title":"Query","description":"The search query (keep it simple - 2-5 words max, basic keywords, single idea). Example: 'coworking space', not 'entrepreneur portrait coworking space natural light authentic candid'."},"n_results":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"N Results","description":"The number of images to return (1-30).","default":1},"orientation":{"anyOf":[{"type":"string","enum":["landscape","portrait","squarish"]},{"type":"null"}],"title":"Orientation","description":"The orientation of the images to return (optional)."}},"type":"object","required":["query"],"title":"SearchStockRequest","description":"Request to search Unsplash for stock photos (the Max `search_stock` tool)."},"SearchStockResponse":{"properties":{"images":{"items":{"$ref":"#/components/schemas/PostImage"},"type":"array","title":"Images","description":"List of stock images from Unsplash."}},"type":"object","required":["images"],"title":"SearchStockResponse","description":"Response from a stock photo search."},"SearchStockVideosRequest":{"properties":{"query":{"type":"string","title":"Query","description":"Search query string"},"page":{"type":"integer","title":"Page","description":"Page number","default":1},"per_page":{"type":"integer","maximum":80.0,"minimum":1.0,"title":"Per Page","description":"Results per page","default":15},"orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orientation","description":"Filter by orientation: landscape, portrait, or square"},"size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Size","description":"Filter by size: large, medium, or small"}},"type":"object","required":["query"],"title":"SearchStockVideosRequest","description":"Request to search for stock videos.","examples":[{"orientation":"landscape","page":1,"per_page":15,"query":"business meeting"}]},"SearchTemplateRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"The business whose template library to search. The selected template is auto-added to this business's library when pulled from the global pool, so this scopes both the read and the (idempotent) write."},"is_meme":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Meme","description":"Optional filter for meme templates. If True, only meme templates. If False, only non-meme templates. If None, includes all."},"has_image_slot":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Image Slot","description":"If True, only return templates that have FILLER image slots (for placing photos/generated images into the design). Use this when you have an image that needs to appear in the template."}},"type":"object","required":["business_id"],"title":"SearchTemplateRequest","description":"Request to search a business's template library for a design to fill."},"SearchTweetsRequest":{"properties":{"query":{"type":"string","minLength":1,"title":"Query","description":"Search query for tweets"},"max_results":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Max Results","description":"Maximum number of tweets to return","default":10},"sort_by":{"type":"string","enum":["relevance","engagement","recency"],"title":"Sort By","description":"Sort order: 'relevance' (default, Twitter's relevance ranking), 'engagement' (by total engagement), 'recency' (newest first)","default":"relevance"}},"type":"object","required":["query"],"title":"SearchTweetsRequest","description":"Request to search for tweets."},"SearchTweetsResponse":{"properties":{"query":{"type":"string","title":"Query"},"results":{"items":{"$ref":"#/components/schemas/TweetResult"},"type":"array","title":"Results"},"total_results":{"type":"integer","title":"Total Results","description":"Number of tweets returned"}},"type":"object","required":["query","results","total_results"],"title":"SearchTweetsResponse","description":"Response from Twitter search."},"SearchableImageCountResponse":{"properties":{"count":{"type":"integer","title":"Count","description":"Library images the photo search can actually return (enabled + alt_text + embedding + linked to a live resource). The frontend uses this to decide whether the 'no stock images' toggle / Generate is allowed."}},"type":"object","required":["count"],"title":"SearchableImageCountResponse"},"SegmentImageRequest":{"properties":{"image_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Image Url","description":"URL of image to segment"},"query":{"type":"string","title":"Query","description":"What to segment (e.g. faces, people)","default":"faces"},"image_height_px":{"type":"integer","title":"Image Height Px","description":"Design height in px; used to compute safe_text_y","default":1350}},"type":"object","required":["image_url"],"title":"SegmentImageRequest","description":"Request for Gemini image segmentation (e.g. for smart text placement)."},"SegmentImageResponse":{"properties":{"segments":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Segments","description":"List of {box_2d, label} (mask omitted for size)"},"safe_text_y":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Safe Text Y","description":"Recommended Y (px) to place text below detected regions; None if no segments"}},"type":"object","title":"SegmentImageResponse","description":"Segmentation result with optional safe Y for text placement below regions."},"SelectThumbnailRequest":{"properties":{"timestamp_ms":{"type":"integer","title":"Timestamp Ms"}},"additionalProperties":false,"type":"object","required":["timestamp_ms"],"title":"SelectThumbnailRequest"},"SelectThumbnailResponse":{"properties":{"poster_url":{"type":"string","title":"Poster Url"},"timestamp_ms":{"type":"integer","title":"Timestamp Ms"}},"additionalProperties":false,"type":"object","required":["poster_url","timestamp_ms"],"title":"SelectThumbnailResponse"},"SendDMRequest":{"properties":{"business_id":{"type":"string","title":"Business Id"},"text":{"type":"string","maxLength":1000,"title":"Text"},"platform":{"type":"string","title":"Platform","default":"facebook"},"integration_id":{"type":"string","title":"Integration Id"},"recipient_id":{"type":"string","title":"Recipient Id"}},"type":"object","required":["business_id","text","integration_id","recipient_id"],"title":"SendDMRequest"},"SendEmailRequest":{"properties":{"to_email":{"type":"string","format":"email","title":"To Email"},"template":{"$ref":"#/components/schemas/EmailTemplate"},"template_vars":{"additionalProperties":{"type":"string"},"type":"object","title":"Template Vars"}},"type":"object","required":["to_email","template","template_vars"],"title":"SendEmailRequest"},"SendInviteRequest":{"properties":{"invitee_user_id":{"type":"string","title":"Invitee User Id","description":"User ID of the person to invite"}},"type":"object","required":["invitee_user_id"],"title":"SendInviteRequest"},"SendVerificationRequest":{"properties":{"phone_number":{"type":"string","title":"Phone Number","description":"Phone number in E.164 format, e.g. +15551234567"}},"type":"object","required":["phone_number"],"title":"SendVerificationRequest"},"SendVerificationResponse":{"properties":{"sent":{"type":"boolean","title":"Sent"}},"type":"object","required":["sent"],"title":"SendVerificationResponse"},"SetArchiveStateRequest":{"properties":{"business_id":{"type":"string","title":"Business Id"},"is_archived":{"type":"boolean","title":"Is Archived"}},"type":"object","required":["business_id","is_archived"],"title":"SetArchiveStateRequest"},"SetReadStateRequest":{"properties":{"business_id":{"type":"string","title":"Business Id"},"is_read":{"type":"boolean","title":"Is Read"}},"type":"object","required":["business_id","is_read"],"title":"SetReadStateRequest"},"SetSkillScheduleRequest":{"properties":{"skill_name":{"type":"string","minLength":1,"title":"Skill Name","description":"The skill to run, without the slash: a saved skill of this business (e.g. `schedule-weekly-tech-tips`) or a built-in one (`create-posts`)."},"weekday":{"type":"integer","maximum":6.0,"minimum":0.0,"title":"Weekday","description":"Day to run: 0 = Monday ... 6 = Sunday."},"local_hour":{"type":"integer","maximum":23.0,"minimum":0.0,"title":"Local Hour","description":"Hour to run, 0-23, on the business's own clock."},"enabled":{"type":"boolean","title":"Enabled","description":"false pauses it without deleting it.","default":true},"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"The business. Defaults to the X-Business-Id header."}},"additionalProperties":false,"type":"object","required":["skill_name","weekday","local_hour"],"title":"SetSkillScheduleRequest"},"SetWritingInstructionRequest":{"properties":{"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"The business to edit. Optional only because the web FE names it via the X-Business-Id header; MCP/agent callers must pass it here."},"platform":{"type":"string","title":"Platform","description":"Which platform's instruction to change. Use 'common' for guidance that applies to every platform.","x-extensible-enum":["common","facebook","instagram","twitter","linkedIn","linkedInProfile","tiktok","pinterest","googleBusiness","instagramStory","youtube"]},"instruction":{"type":"string","maxLength":2000,"title":"Instruction","description":"The new instruction text. Pass an EMPTY STRING to remove this platform's instruction and fall back to the default."}},"type":"object","required":["platform","instruction"],"title":"SetWritingInstructionRequest","description":"Request to set or clear ONE platform's caption-writing instruction."},"SetWritingInstructionResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Confirmation message to relay to the user."},"platform_writing_instructions":{"additionalProperties":{"type":"string"},"type":"object","title":"Platform Writing Instructions","description":"Every platform instruction still set, after this change. A platform missing from this map is using its default."}},"type":"object","required":["message","platform_writing_instructions"],"title":"SetWritingInstructionResponse","description":"Confirmation, plus the instructions that remain after the change."},"SetupCardSessionRequest":{"properties":{"org_id":{"type":"string","title":"Org Id"},"return_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return Url"}},"additionalProperties":false,"type":"object","required":["org_id"],"title":"SetupCardSessionRequest"},"SignedUploadUrlResponse":{"properties":{"token":{"type":"string","title":"Token","description":"Signed upload token for x-signature header"},"path":{"type":"string","title":"Path","description":"Storage path for the upload"}},"type":"object","required":["token","path"],"title":"SignedUploadUrlResponse","description":"Response containing signed upload URL token for Supabase TUS uploads.","examples":[{"path":"uploads/business-id/filename.mp4","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}]},"SignupRequest":{"properties":{"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"given_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Given Name"},"family_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Family Name"},"attribution":{"anyOf":[{"$ref":"#/components/schemas/MarketingAttribution"},{"type":"null"}]}},"type":"object","title":"SignupRequest"},"SilenceRemovalParams":{"properties":{"noise_db":{"type":"integer","maximum":-10.0,"minimum":-60.0,"title":"Noise Db","description":"Noise floor in dB — audio below this level is considered silence","default":-30},"min_duration":{"type":"number","maximum":2.0,"minimum":0.1,"title":"Min Duration","description":"Minimum silence duration in seconds to remove","default":0.2}},"type":"object","title":"SilenceRemovalParams","description":"Parameters for silence removal transform."},"SilenceRemovalTransform":{"properties":{"type":{"type":"string","const":"remove_silence","title":"Type","default":"remove_silence"},"params":{"$ref":"#/components/schemas/SilenceRemovalParams"}},"type":"object","title":"SilenceRemovalTransform","description":"Silence removal transform definition."},"SkillListResponse":{"properties":{"skills":{"items":{"$ref":"#/components/schemas/SkillResponse"},"type":"array","title":"Skills"}},"type":"object","required":["skills"],"title":"SkillListResponse","description":"List of skills."},"SkillResponse":{"properties":{"id":{"type":"string","title":"Id"},"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"Business ID (null for system skills)"},"creator_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Id","description":"Creator user ID (null for built-in skills)"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"instruction_md":{"type":"string","title":"Instruction Md"},"icon":{"type":"string","title":"Icon","default":"ThunderboltOutlined"},"color":{"type":"string","title":"Color","default":"#6CAEFF"},"category":{"type":"string","title":"Category","default":"Create"},"is_built_in":{"type":"boolean","title":"Is Built In","description":"True for system skills","default":false},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","business_id","creator_id","name","description","instruction_md","created_at","updated_at"],"title":"SkillResponse","description":"Skill response model."},"SkillScheduleResponse":{"properties":{"id":{"type":"string","title":"Id"},"skill_name":{"type":"string","title":"Skill Name"},"weekday":{"type":"integer","title":"Weekday"},"local_hour":{"type":"integer","title":"Local Hour"},"enabled":{"type":"boolean","title":"Enabled"},"paused_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paused Reason"},"timezone":{"type":"string","title":"Timezone"},"next_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Run At"},"next_run_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Run Local"}},"type":"object","required":["id","skill_name","weekday","local_hour","enabled","paused_reason","timezone","next_run_at","next_run_local"],"title":"SkillScheduleResponse","description":"The schedule as saved, with its next run on the business's clock."},"SkippedPost":{"properties":{"id":{"type":"string","title":"Id"},"reason":{"type":"string","enum":["PUBLISHED","PUBLISHING","CAPTION_TOO_LONG"],"title":"Reason","description":"PUBLISHED: already live, never edited. PUBLISHING: going out right now. CAPTION_TOO_LONG: the replace would push a caption over its platform's limit; fix that post by hand."}},"type":"object","required":["id","reason"],"title":"SkippedPost"},"SlideResult":{"properties":{"image_url":{"type":"string","title":"Image Url","description":"URL of the selected image"},"image_keyword":{"type":"string","title":"Image Keyword","description":"Search keyword used to find this image"},"media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Id","description":"Library media id of this image, if it came from the library"}},"type":"object","required":["image_url","image_keyword"],"title":"SlideResult"},"Snapshot":{"properties":{"platform":{"type":"string","title":"Platform"},"slug":{"type":"string","title":"Slug"},"normalized_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Slug"},"period":{"type":"string","enum":["day","week","days_28","lifetime"],"title":"Period"},"window_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Window Start"},"window_end":{"type":"string","format":"date-time","title":"Window End"},"value":{"type":"number","title":"Value"},"source_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Field"}},"type":"object","required":["platform","slug","period","window_end","value"],"title":"Snapshot"},"SnapshotMedia":{"properties":{"id":{"type":"string","title":"Id","description":"Media ID. Pass it in create_post's media_ids."},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text","description":"What the photo shows."},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type","description":"image, video or audio."},"last_used_at_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At Local","description":"When it was last put on a post, on the business's clock. Null means it has never been posted."},"low_res":{"type":"boolean","title":"Low Res","description":"True when the longest side is under 1080px, so it may look soft on Instagram or Facebook. Same as search_media_library.low_res.","default":false}},"type":"object","required":["id"],"title":"SnapshotMedia","description":"A library photo that matched a search, ready to name in a plan."},"SnapshotMediaMatch":{"properties":{"query":{"type":"string","title":"Query","description":"The search, as it was sent."},"media":{"items":{"$ref":"#/components/schemas/SnapshotMedia"},"type":"array","title":"Media","description":"Best matches first. A photo already listed under an earlier query is not repeated here."}},"type":"object","required":["query","media"],"title":"SnapshotMediaMatch","description":"The library matches for one of the `media_queries`."},"SnapshotQueue":{"properties":{"queued_count":{"type":"integer","format":"int32","title":"Queued Count","description":"Posts waiting in the daily queue. Same as get_queue_summary.queued_count."},"runs_dry_at_local":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Runs Dry At Local","description":"When the LAST queued post is estimated to publish, on the business's clock, e.g. 'Fri Oct 2, 9:00 AM CDT'. After it nothing more goes out. Null when the queue is empty or no connected account can publish."}},"type":"object","required":["queued_count"],"title":"SnapshotQueue","description":"How full the daily queue is, and when it runs out."},"SnapshotRecentPosts":{"properties":{"posts":{"items":{"type":"string"},"type":"array","title":"Posts","description":"One line per post, newest first: '<day> · <status> · <first 50 characters of the caption>', e.g. 'Sep 23 · PUBLISHED · Termites swarm in spring...'. The day is when it published, else when it is scheduled, else when it was written, on the business's clock. Rejected (trashed) posts are left out."},"truncated":{"type":"boolean","title":"Truncated","description":"True when more posts were created in the window than are listed; call list_posts to page through them."}},"type":"object","required":["posts","truncated"],"title":"SnapshotRecentPosts","description":"Posts created in the last `recent_days` days, newest first."},"SnapshotSchedule":{"properties":{"timeslots_local":{"items":{"type":"string"},"type":"array","title":"Timeslots Local","description":"Weekly publish slots on the business's clock, e.g. 'MON 09:00'. Same values as get_posting_schedule.timeslots_local."},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"IANA timezone the local slots are in, e.g. 'America/Chicago'. 'UTC' when the business has none set."},"paused":{"type":"boolean","title":"Paused","description":"True while the schedule is paused: nothing in the queue publishes until it resumes."}},"type":"object","required":["timeslots_local","paused"],"title":"SnapshotSchedule","description":"The posting schedule, on the business's own clock."},"SnapshotTopicGroup":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Category name. Null for topics with no category."},"titles":{"type":"string","title":"Titles","description":"Titles of the enabled topics in this category, newest first, separated by ' | '."}},"type":"object","required":["titles"],"title":"SnapshotTopicGroup","description":"The enabled topics in one category."},"SnapshotTopics":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/SnapshotTopicGroup"},"type":"array","title":"Groups","description":"Enabled topics grouped by category, in the order list_topics returns them."},"disabled_count":{"type":"integer","format":"int32","title":"Disabled Count","description":"Topics that exist but are switched off. Not listed."},"truncated":{"type":"boolean","title":"Truncated","description":"True when the workspace has more topics than the snapshot reads; call list_topics for the rest."}},"type":"object","required":["groups","disabled_count","truncated"],"title":"SnapshotTopics","description":"The topics posts can be about. Call list_topics when you need topic ids."},"SocialPostsResponse":{"properties":{"platform":{"$ref":"#/components/schemas/Platform","description":"Platform posts were fetched from"},"account_id":{"type":"string","title":"Account Id","description":"Identifier of the page or account"},"posts":{"$ref":"#/components/schemas/FacebookPostsResponse","description":"Posts payload"}},"type":"object","required":["platform","account_id","posts"],"title":"SocialPostsResponse","description":"Response payload for social posts.","examples":[{"account_id":"page-123","platform":"facebook","posts":{"data":[],"paging":{}}}]},"SocialVoiceResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Async task ID. Watch via Supabase realtime on async_tasks table for completion."}},"type":"object","required":["task_id"],"title":"SocialVoiceResponse"},"SourceAccount":{"properties":{"integration_id":{"type":"string","title":"Integration Id"},"name":{"type":"string","title":"Name"},"avatar_url":{"type":"string","title":"Avatar Url"}},"type":"object","required":["integration_id","name","avatar_url"],"title":"SourceAccount","description":"Which connected account an item came from (a business can have several)."},"SpeedupParams":{"properties":{"factor":{"type":"number","maximum":4.0,"minimum":1.0,"title":"Factor","description":"Speedup factor (1.25 = 25% faster, 2.0 = double speed)"}},"type":"object","required":["factor"],"title":"SpeedupParams","description":"Parameters for video speedup transform."},"SpeedupTransform":{"properties":{"type":{"type":"string","const":"speedup","title":"Type","default":"speedup"},"params":{"$ref":"#/components/schemas/SpeedupParams"}},"type":"object","required":["params"],"title":"SpeedupTransform","description":"Speedup transform definition."},"StandardizeMediaPayload":{"properties":{"type":{"type":"string","title":"Type"},"table":{"type":"string","title":"Table"},"schema_name":{"type":"string","title":"Schema Name"},"record":{"$ref":"#/components/schemas/BusinessMediaRecord"},"old_record":{"anyOf":[{"$ref":"#/components/schemas/BusinessMediaRecord"},{"type":"null"}]}},"type":"object","required":["type","table","schema_name","record"],"title":"StandardizeMediaPayload"},"StandardizeMediaRequest":{"properties":{"payload":{"$ref":"#/components/schemas/StandardizeMediaPayload"}},"type":"object","required":["payload"],"title":"StandardizeMediaRequest"},"StatusResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Operation result (e.g. 'deleted', 'revoked')"}},"type":"object","required":["status"],"title":"StatusResponse"},"StockVideoResult":{"properties":{"id":{"type":"integer","title":"Id","description":"Video ID"},"url":{"type":"string","title":"Url","description":"Best quality video URL"},"thumbnail_url":{"type":"string","title":"Thumbnail Url","description":"Thumbnail image URL"},"width":{"type":"integer","title":"Width","description":"Video width in pixels"},"height":{"type":"integer","title":"Height","description":"Video height in pixels"},"duration_seconds":{"type":"integer","title":"Duration Seconds","description":"Duration in seconds"},"photographer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photographer","description":"Photographer name"},"photographer_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photographer Url","description":"Photographer profile URL"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","description":"Video tags"}},"type":"object","required":["id","url","thumbnail_url","width","height","duration_seconds"],"title":"StockVideoResult","description":"Single stock video result."},"StockVideoSearchResponse":{"properties":{"page":{"type":"integer","title":"Page","description":"Current page number"},"per_page":{"type":"integer","title":"Per Page","description":"Results per page"},"total_results":{"type":"integer","title":"Total Results","description":"Total number of results"},"next_page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page","description":"URL for next page"},"prev_page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prev Page","description":"URL for previous page"},"videos":{"items":{"$ref":"#/components/schemas/StockVideoResult"},"type":"array","title":"Videos","description":"List of video results"}},"type":"object","required":["page","per_page","total_results","videos"],"title":"StockVideoSearchResponse","description":"Response from stock video search."},"StrategyIdea":{"properties":{"idea":{"type":"string","title":"Idea","description":"The idea in one sentence, 25 words max"},"effort":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Effort","description":"1 = write it now, 3 = needs production"},"engagement":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Engagement","description":"1 = low ceiling, 3 = could travel"},"need_from_user":{"type":"string","title":"Need From User","description":"The one thing the human must supply, as a 1-4 word noun phrase (e.g. '30-sec screen recording'). 'Nothing' when self-contained."}},"type":"object","required":["idea","effort","engagement","need_from_user"],"title":"StrategyIdea","description":"One scored idea, as the LLM produces it and the API returns it."},"StrategyIdeasResponse":{"properties":{"ideas":{"items":{"$ref":"#/components/schemas/StrategyIdea"},"type":"array","title":"Ideas"},"strategy_missing":{"type":"boolean","title":"Strategy Missing","description":"True when the business has no strategy doc yet. The frontend uses this to nudge toward /refresh-strategy instead of showing an empty section.","default":false}},"type":"object","required":["ideas"],"title":"StrategyIdeasResponse"},"StrategyIdeasSeenRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business the ideas belong to"},"idea_ids":{"items":{"type":"string"},"type":"array","title":"Idea Ids","description":"Ideas the user has just been shown."}},"type":"object","required":["business_id"],"title":"StrategyIdeasSeenRequest"},"StrategyIdeasTopUpRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business to top up ideas for"}},"type":"object","required":["business_id"],"title":"StrategyIdeasTopUpRequest"},"Styles":{"properties":{"text_styles":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/TextStyle"},"type":"object"},{"type":"null"}],"title":"Text Styles"},"color_preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color Preset"}},"type":"object","title":"Styles","description":"Global style definitions."},"SubscriptionInfo":{"properties":{"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"active, past_due, canceled, trialing, unpaid"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"current_period_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period Start"},"current_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period End"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End"},"cancel_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel At","description":"Scheduled cancellation date, if set"},"canceled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canceled At","description":"When it was canceled, if applicable"},"trial_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trial Start"},"trial_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trial End"},"discount":{"anyOf":[{"$ref":"#/components/schemas/DiscountInfo"},{"type":"null"}]},"line_items":{"items":{"$ref":"#/components/schemas/LineItemInfo"},"type":"array","title":"Line Items"}},"type":"object","required":["plan","status","created_at","current_period_start","current_period_end","cancel_at_period_end","cancel_at","canceled_at","trial_start","trial_end","discount","line_items"],"title":"SubscriptionInfo","description":"Subscription details."},"SuccessfulPlatform":{"properties":{"platform":{"type":"string","title":"Platform"},"post_url":{"type":"string","title":"Post Url"}},"type":"object","required":["platform","post_url"],"title":"SuccessfulPlatform"},"SuggestAiPromptRequest":{"properties":{"idea":{"type":"string","title":"Idea","description":"The post idea to generate an AI image/video prompt for"},"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"Business context for better prompts"},"media_type":{"type":"string","title":"Media Type","description":"'image' or 'video'","default":"image"}},"type":"object","required":["idea"],"title":"SuggestAiPromptRequest"},"SuggestAiPromptResponse":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"A detailed prompt for AI image/video generation"}},"type":"object","required":["prompt"],"title":"SuggestAiPromptResponse"},"SuggestProfileUpdateRequest":{"properties":{"old_caption":{"type":"string","title":"Old Caption","description":"The caption text before the user's edit."},"new_caption":{"type":"string","title":"New Caption","description":"The caption text after the user's edit."}},"type":"object","required":["old_caption","new_caption"],"title":"SuggestProfileUpdateRequest"},"SuggestTopicsRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"The business to suggest topics for."},"existing_topics":{"items":{"type":"string"},"type":"array","title":"Existing Topics","description":"Titles of existing topics so the LLM avoids duplicates."}},"type":"object","required":["business_id"],"title":"SuggestTopicsRequest"},"SuggestTopicsResponse":{"properties":{"topics":{"items":{"$ref":"#/components/schemas/SuggestedTopic"},"type":"array","title":"Topics","description":"Suggested content topics derived from analyzing past posts."},"caption_count":{"type":"integer","title":"Caption Count","description":"Number of posts that were analyzed."}},"type":"object","required":["topics","caption_count"],"title":"SuggestTopicsResponse"},"SuggestedMatch":{"properties":{"statuses":{"items":{"type":"string"},"type":"array","title":"Statuses"}},"type":"object","required":["statuses"],"title":"SuggestedMatch"},"SuggestedReplace":{"properties":{"find":{"type":"string","title":"Find"},"replace":{"type":"string","title":"Replace"}},"type":"object","required":["find","replace"],"title":"SuggestedReplace"},"SuggestedRule":{"properties":{"match":{"$ref":"#/components/schemas/SuggestedMatch"},"set":{"$ref":"#/components/schemas/SuggestedSet"}},"type":"object","required":["match","set"],"title":"SuggestedRule","description":"An `update_posts` request body, handed back verbatim: \"call it with exactly this\"."},"SuggestedSet":{"properties":{"caption_replace":{"$ref":"#/components/schemas/SuggestedReplace"}},"type":"object","required":["caption_replace"],"title":"SuggestedSet"},"SuggestedTopic":{"properties":{"title":{"type":"string","title":"Title","description":"Short topic title (3-8 words), suitable as a content topic."},"body":{"type":"string","title":"Body","description":"1-2 sentence description of what this topic covers and why it's worth posting about. Should give the user enough context to decide whether to add it."},"category":{"type":"string","title":"Category","description":"A suggested category name for grouping this topic (e.g. 'Tips & Education', 'Behind the Scenes')."},"rationale":{"type":"string","title":"Rationale","description":"Brief explanation of why this topic is suggested — e.g. 'Your posts about dental tips consistently get 2x more engagement.'"}},"type":"object","required":["title","body","category","rationale"],"title":"SuggestedTopic"},"SuggestionActionRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business the suggestion belongs to"}},"type":"object","required":["business_id"],"title":"SuggestionActionRequest"},"SuggestionResponse":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","title":"Status"},"target_field":{"type":"string","title":"Target Field"},"suggestion":{"type":"string","title":"Suggestion"},"applied_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Applied Value"}},"type":"object","required":["id","status","target_field","suggestion"],"title":"SuggestionResponse","description":"The row after the verdict, so the caller can update without a refetch."},"SvgComponent":{"properties":{"type":{"type":"string","const":"svg","title":"Type","default":"svg"},"id":{"type":"string","title":"Id"},"src":{"type":"string","minLength":1,"title":"Src"},"x":{"type":"number","title":"X","default":0.0},"y":{"type":"number","title":"Y","default":0.0},"width":{"type":"number","title":"Width","default":100.0},"height":{"type":"number","title":"Height","default":100.0},"name":{"type":"string","title":"Name","default":""},"filters":{"additionalProperties":true,"type":"object","title":"Filters","default":{}},"keepRatio":{"type":"boolean","title":"Keepratio","default":false},"maskSrc":{"type":"string","title":"Masksrc","default":""},"rotation":{"type":"number","title":"Rotation","default":0.0},"blurEnabled":{"type":"boolean","title":"Blurenabled","default":false},"blurRadius":{"type":"number","title":"Blurradius","default":0},"brightnessEnabled":{"type":"boolean","title":"Brightnessenabled","default":false},"brightness":{"type":"number","title":"Brightness","default":0},"shadowEnabled":{"type":"boolean","title":"Shadowenabled","default":false},"shadowBlur":{"type":"number","title":"Shadowblur","default":0},"shadowOffsetX":{"type":"number","title":"Shadowoffsetx","default":0},"shadowOffsetY":{"type":"number","title":"Shadowoffsety","default":0},"shadowColor":{"type":"string","title":"Shadowcolor","default":""},"shadowOpacity":{"type":"number","title":"Shadowopacity","default":0.0},"flipX":{"type":"boolean","title":"Flipx","default":false},"flipY":{"type":"boolean","title":"Flipy","default":false},"cornerRadius":{"type":"number","title":"Cornerradius","default":0.0},"selectable":{"type":"boolean","title":"Selectable","default":true},"alwaysOnTop":{"type":"boolean","title":"Alwaysontop","default":false},"showInExport":{"type":"boolean","title":"Showinexport","default":true},"draggable":{"type":"boolean","title":"Draggable","default":true},"contentEditable":{"type":"boolean","title":"Contenteditable","default":true},"removable":{"type":"boolean","title":"Removable","default":true},"resizable":{"type":"boolean","title":"Resizable","default":true},"colorsReplace":{"additionalProperties":{"type":"string"},"type":"object","title":"Colorsreplace"},"styleEditable":{"type":"boolean","title":"Styleeditable","default":true},"visible":{"type":"boolean","title":"Visible","default":true},"sepiaEnabled":{"type":"boolean","title":"Sepiaenabled","default":false},"opacity":{"type":"number","title":"Opacity","default":1.0},"grayscaleEnabled":{"type":"boolean","title":"Grayscaleenabled","default":false},"cropY":{"type":"number","title":"Cropy","default":0},"cropX":{"type":"number","title":"Cropx","default":0},"cropWidth":{"type":"number","title":"Cropwidth","default":1},"cropHeight":{"type":"number","title":"Cropheight","default":1},"borderSize":{"type":"number","title":"Bordersize","default":0},"borderColor":{"type":"string","title":"Bordercolor","default":"black"},"animations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Animations","default":[]},"custom":{"$ref":"#/components/schemas/SvgMeta"}},"type":"object","required":["src"],"title":"SvgComponent"},"SvgMeta":{"properties":{"colorType":{"$ref":"#/components/schemas/ColorType","default":"AUTO"},"fill":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fill"},"imageType":{"anyOf":[{"type":"string","enum":["STATIC","FILLER","LOGO","AVATAR"]},{"type":"null"}],"title":"Imagetype"},"isContainer":{"type":"boolean","title":"Iscontainer","default":false}},"type":"object","title":"SvgMeta"},"SwapImageRequest":{"properties":{"old_media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old Media Id"},"old_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old Image Url"},"new_image_url":{"type":"string","title":"New Image Url"},"new_media_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Media Id"},"new_search_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Search Term"}},"type":"object","required":["new_image_url"],"title":"SwapImageRequest"},"SwapImageResult":{"properties":{"design_id":{"type":"string","title":"Design Id"},"media_urls":{"items":{"type":"string"},"type":"array","title":"Media Urls"}},"type":"object","required":["design_id","media_urls"],"title":"SwapImageResult"},"SyncError":{"properties":{"integration_id":{"type":"string","title":"Integration Id"},"workspace":{"type":"string","title":"Workspace"},"platform":{"type":"string","title":"Platform"},"error":{"type":"string","title":"Error"}},"type":"object","required":["integration_id","workspace","platform","error"],"title":"SyncError"},"SyncIfStaleRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID to sync"},"stale_hours":{"type":"integer","title":"Stale Hours","description":"Consider stale if not synced within this many hours","default":2}},"type":"object","required":["business_id"],"title":"SyncIfStaleRequest","description":"Request to sync stale integrations for a business."},"SyncIfStaleResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Status message"}},"type":"object","required":["message"],"title":"SyncIfStaleResponse","description":"Response for sync-if-stale."},"SyncRequest":{"properties":{"go_back_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Go Back Until","description":"How far back to sync posts. None = full backfill (all history), '90d' = stop at 90 days ago (default), ISO date string = stop at specific date","default":"90d"}},"additionalProperties":false,"type":"object","title":"SyncRequest","description":"Request to sync an integration.","examples":[{"go_back_until":"90d"}]},"SyncStaleRequest":{"properties":{"batch_size":{"type":"integer","title":"Batch Size","description":"Number of integrations to sync per batch","default":200},"concurrency":{"type":"integer","title":"Concurrency","description":"Number of concurrent sync operations","default":30}},"additionalProperties":false,"type":"object","title":"SyncStaleRequest","description":"Request to sync stale/due integrations.","examples":[{"batch_size":50,"concurrency":15}]},"SyncStaleResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Status message"},"async_task":{"type":"boolean","title":"Async Task","description":"Whether sync is running as async task"},"params":{"additionalProperties":{"type":"integer"},"type":"object","title":"Params","description":"Sync parameters used"}},"type":"object","required":["message","async_task","params"],"title":"SyncStaleResponse","description":"Response from sync stale trigger.","examples":[{"async_task":true,"message":"Sync started","params":{"batch_size":50,"concurrency":15}}]},"SyncStatusResponse":{"properties":{"integration_id":{"type":"string","title":"Integration Id","description":"Integration ID"},"posts":{"additionalProperties":true,"type":"object","title":"Posts","description":"Posts sync status information"},"account":{"additionalProperties":true,"type":"object","title":"Account","description":"Account sync status information"}},"additionalProperties":false,"type":"object","required":["integration_id","posts","account"],"title":"SyncStatusResponse","description":"Sync status for an integration.","examples":[{"account":{"last_synced_at":"2024-01-15T10:00:00Z"},"integration_id":"int-123","posts":{"last_synced_at":"2024-01-15T10:00:00Z","total_posts":150}}]},"SyncSubscriptionRequest":{"properties":{"org_id":{"type":"string","title":"Org Id"},"auto_update":{"type":"boolean","title":"Auto Update","default":false}},"type":"object","required":["org_id"],"title":"SyncSubscriptionRequest"},"SyncTriggerResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Status message"},"integration_id":{"type":"string","title":"Integration Id","description":"Integration ID"},"async_task":{"type":"boolean","title":"Async Task","description":"Whether sync is running as async task"}},"additionalProperties":false,"type":"object","required":["message","integration_id","async_task"],"title":"SyncTriggerResponse","description":"Response when sync is triggered.","examples":[{"async_task":true,"integration_id":"int-123","message":"Sync started"}]},"TemplateDetail":{"properties":{"template_id":{"type":"string","title":"Template Id","description":"Template id — pass to create_design."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"What the template is for."},"page_count":{"type":"integer","title":"Page Count","description":"Number of pages."},"template_url":{"type":"string","title":"Template Url","description":"Open the template in the editor to view or tweak it — a link you can hand the user."},"pages":{"items":{"$ref":"#/components/schemas/TemplatePageDetail"},"type":"array","title":"Pages","description":"Per-page fields and slots."}},"type":"object","required":["template_id","page_count","template_url"],"title":"TemplateDetail","description":"A template plus every field/slot you must fill to create a design from it."},"TemplateImageSlot":{"properties":{"id":{"type":"string","title":"Id","description":"Slot id — use as the key in create_design.filler_media."},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","description":"Slot role: FILLER (you must provide a photo), LOGO/AVATAR/WATERMARK (brand, optional)."},"required":{"type":"boolean","title":"Required","description":"True for FILLER slots — you must supply an image."},"width":{"type":"integer","title":"Width","description":"Slot width in px."},"height":{"type":"integer","title":"Height","description":"Slot height in px."}},"type":"object","required":["id","required","width","height"],"title":"TemplateImageSlot","description":"An image placeholder in a template that you can fill with a photo/logo."},"TemplateMetadata":{"properties":{"id":{"type":"string","title":"Id"},"theme_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"page_count":{"type":"integer","title":"Page Count"},"pages":{"items":{"$ref":"#/components/schemas/TemplatePage"},"type":"array","title":"Pages"}},"type":"object","required":["id","description","page_count","pages"],"title":"TemplateMetadata","description":"Metadata about a design template."},"TemplatePage":{"properties":{"id":{"type":"string","title":"Id"},"page_number":{"type":"integer","title":"Page Number"},"image_slots":{"items":{"$ref":"#/components/schemas/ImageSlot"},"type":"array","title":"Image Slots"},"text_fields":{"items":{"$ref":"#/components/schemas/TextField"},"type":"array","title":"Text Fields"}},"type":"object","required":["id","page_number","image_slots","text_fields"],"title":"TemplatePage","description":"A single page in a template."},"TemplatePageDetail":{"properties":{"page_number":{"type":"integer","title":"Page Number","description":"1-based page index."},"image_slots":{"items":{"$ref":"#/components/schemas/TemplateImageSlot"},"type":"array","title":"Image Slots","description":"Image slots on this page."},"text_fields":{"items":{"$ref":"#/components/schemas/TemplateTextField"},"type":"array","title":"Text Fields","description":"Text fields on this page."}},"type":"object","required":["page_number"],"title":"TemplatePageDetail","description":"One page of a template, with the fields and slots to fill."},"TemplateSearchRequest":{"properties":{"is_meme":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Meme","description":"True = only meme templates, False = only non-meme, None = any."},"has_image_slot":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Image Slot","description":"True = only templates with a fillable photo slot. Use when you have an image to place."}},"additionalProperties":false,"type":"object","title":"TemplateSearchRequest","description":"Filters for picking a template from the business's library."},"TemplateSearchResponse":{"properties":{"template":{"anyOf":[{"$ref":"#/components/schemas/TemplateDetail"},{"type":"null"}],"description":"The chosen template and its fields/slots."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"'no_image_slot_templates' when has_image_slot was requested but none exist."},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Human guidance when `error` is set (e.g. use an image-only post)."}},"type":"object","title":"TemplateSearchResponse","description":"Either a chosen template (with its fields/slots), or a no-image-slot signal."},"TemplateSearchResult":{"properties":{"metadata":{"anyOf":[{"$ref":"#/components/schemas/TemplateMetadata"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"TemplateSearchResult","description":"Either a found template's metadata, or a no-image-slot fallback signal."},"TemplateSummary":{"properties":{"template_id":{"type":"string","title":"Template Id","description":"Template id — pass to create_design."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Template name."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"What the template is for."},"page_count":{"type":"integer","title":"Page Count","description":"Number of pages (1 = single image, >1 = carousel)."},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url","description":"Preview image of the unfilled template, if available."},"template_url":{"type":"string","title":"Template Url","description":"Open the template in the editor to view or tweak it — a link you can hand the user."},"has_image_slots":{"type":"boolean","title":"Has Image Slots","description":"True when this template has a fillable photo (FILLER) slot. Pick one of these when you have an image to place.","default":false},"text_slot_count":{"type":"integer","title":"Text Slot Count","description":"How many editable text fields you'll fill (STATIC/locked text is not counted).","default":0}},"type":"object","required":["template_id","page_count","template_url"],"title":"TemplateSummary","description":"Lightweight template entry for browsing the library."},"TemplateTextField":{"properties":{"id":{"type":"string","title":"Id","description":"Field id — use as the key in create_design.text_content."},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","description":"Field role (e.g. HEADER, BODY)."},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions","description":"Guidance for what to write here — always populated (a sensible default when the template didn't set one)."},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters","description":"Character limit for this field, if any. create_design rejects copy longer than this with a 422."},"example":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Example","description":"A short example of good copy for this field, to show the shape/length expected."}},"type":"object","required":["id"],"title":"TemplateTextField","description":"An editable text field in a template that you fill with copy."},"TemplateUseInfo":{"properties":{"passed":{"type":"boolean","title":"Passed","description":"True if no issues found"},"issues":{"items":{"type":"string"},"type":"array","title":"Issues","description":"Issues found: 'graphic', 'low_resolution'","default":[]},"details":{"type":"string","title":"Details","description":"Why it was flagged","default":""}},"type":"object","required":["passed"],"title":"TemplateUseInfo","description":"Whether this uploaded image works as a design template's background photo."},"Testimonial":{"properties":{"quote":{"type":"string","title":"Quote"},"author":{"type":"string","title":"Author"},"author_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Description"}},"type":"object","required":["quote","author"],"title":"Testimonial"},"TextComponent":{"properties":{"type":{"type":"string","const":"text","title":"Type","default":"text"},"id":{"type":"string","title":"Id"},"text":{"type":"string","title":"Text"},"x":{"type":"number","title":"X","default":0.0},"y":{"type":"number","title":"Y","default":0.0},"fontSize":{"type":"number","title":"Fontsize","default":70.0},"height":{"type":"number","title":"Height","default":100.0},"placeholder":{"type":"string","title":"Placeholder","default":""},"name":{"type":"string","title":"Name","default":""},"filters":{"additionalProperties":true,"type":"object","title":"Filters","default":{}},"textTransform":{"type":"string","title":"Texttransform","default":""},"rotation":{"type":"number","title":"Rotation","default":0.0},"locked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Locked","default":false},"blurEnabled":{"type":"boolean","title":"Blurenabled","default":false},"blurRadius":{"type":"number","title":"Blurradius","default":0.0},"brightnessEnabled":{"type":"boolean","title":"Brightnessenabled","default":false},"brightness":{"type":"number","title":"Brightness","default":1.0},"shadowEnabled":{"type":"boolean","title":"Shadowenabled","default":false},"shadowBlur":{"type":"number","title":"Shadowblur","default":0.0},"shadowOffsetX":{"type":"number","title":"Shadowoffsetx","default":0.0},"shadowOffsetY":{"type":"number","title":"Shadowoffsety","default":0.0},"shadowColor":{"type":"string","title":"Shadowcolor","default":"black"},"shadowOpacity":{"type":"number","title":"Shadowopacity","default":1.0},"fontFamily":{"type":"string","title":"Fontfamily","default":"Roboto"},"fontStyle":{"type":"string","title":"Fontstyle","default":"normal"},"fontWeight":{"type":"string","title":"Fontweight","default":"normal"},"textDecoration":{"type":"string","title":"Textdecoration","default":""},"fill":{"type":"string","title":"Fill","default":"black"},"align":{"type":"string","title":"Align","default":"left"},"width":{"type":"number","title":"Width","default":100.0},"strokeWidth":{"type":"number","title":"Strokewidth","default":0.0},"stroke":{"type":"string","title":"Stroke","default":""},"lineHeight":{"type":"number","title":"Lineheight","default":1.0},"letterSpacing":{"type":"number","title":"Letterspacing","default":0.0},"backgroundEnabled":{"type":"boolean","title":"Backgroundenabled","default":false},"backgroundColor":{"type":"string","title":"Backgroundcolor","default":"white"},"backgroundOpacity":{"type":"number","title":"Backgroundopacity","default":1.0},"backgroundCornerRadius":{"type":"number","title":"Backgroundcornerradius","default":0.0},"backgroundPadding":{"type":"number","title":"Backgroundpadding","default":0.0},"selectable":{"type":"boolean","title":"Selectable","default":true},"alwaysOnTop":{"type":"boolean","title":"Alwaysontop","default":false},"showInExport":{"type":"boolean","title":"Showinexport","default":true},"draggable":{"type":"boolean","title":"Draggable","default":true},"contentEditable":{"type":"boolean","title":"Contenteditable","default":true},"removable":{"type":"boolean","title":"Removable","default":true},"resizable":{"type":"boolean","title":"Resizable","default":true},"styleEditable":{"type":"boolean","title":"Styleeditable","default":true},"verticalAlign":{"type":"string","enum":["top","middle","bottom"],"title":"Verticalalign","default":"top"},"visible":{"type":"boolean","title":"Visible","default":true},"sepiaEnabled":{"type":"boolean","title":"Sepiaenabled","default":false},"opacity":{"type":"number","title":"Opacity","default":1},"grayscaleEnabled":{"type":"boolean","title":"Grayscaleenabled","default":false},"animations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Animations","default":[]},"custom":{"$ref":"#/components/schemas/TextFillGuide"}},"type":"object","required":["text"],"title":"TextComponent"},"TextField":{"properties":{"id":{"type":"string","title":"Id"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"max_characters":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Characters"}},"type":"object","required":["id"],"title":"TextField","description":"Text field definition in a template page."},"TextFillGuide":{"properties":{"instructions":{"type":"string","title":"Instructions","default":""},"maxCharacters":{"type":"integer","title":"Maxcharacters","default":100},"colorType":{"$ref":"#/components/schemas/ColorType","default":"AUTO"},"allCaps":{"type":"boolean","title":"Allcaps","default":false},"type":{"$ref":"#/components/schemas/TextType","default":"CUSTOM"},"maxFontSize":{"type":"integer","title":"Maxfontsize","default":100},"highlightColorType":{"$ref":"#/components/schemas/ColorType","default":"AUTO"}},"type":"object","title":"TextFillGuide"},"TextOverlay":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","const":"text","title":"Type"},"text":{"type":"string","title":"Text"},"start_time":{"type":"number","title":"Start Time"},"end_time":{"type":"number","title":"End Time"},"position":{"$ref":"#/components/schemas/OverlayPosition"},"style_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style Id"},"style":{"anyOf":[{"$ref":"#/components/schemas/InlineTextStyle"},{"type":"null"}]},"layer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Layer"},"animation":{"anyOf":[{"$ref":"#/components/schemas/OverlayAnimation"},{"type":"null"}]}},"type":"object","required":["id","type","text","start_time","end_time","position"],"title":"TextOverlay","description":"Text overlay element."},"TextStyle":{"properties":{"font_family":{"type":"string","title":"Font Family"},"font_size_rel":{"type":"number","title":"Font Size Rel"},"color":{"type":"string","title":"Color"},"stroke_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stroke Color"},"stroke_width":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stroke Width"},"shadow":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"string"}]},"type":"object"},{"type":"null"}],"title":"Shadow"}},"type":"object","required":["font_family","font_size_rel","color"],"title":"TextStyle","description":"Text style definition."},"TextType":{"type":"string","enum":["HEADER","BODY","CTA","BUSINESS_NAME","SOCIAL_HANDLE","CUSTOM","STATIC"],"title":"TextType"},"ThresholdRequest":{"properties":{"business_id":{"type":"string","title":"Business Id"}},"type":"object","required":["business_id"],"title":"ThresholdRequest"},"TikTokMusicCheck":{"properties":{"verdict":{"$ref":"#/components/schemas/TikTokMusicVerdict"},"auto_add_music_enabled":{"type":"boolean","title":"Auto Add Music Enabled"},"photo_posts_checked":{"type":"integer","title":"Photo Posts Checked"},"photo_posts_with_music":{"type":"integer","title":"Photo Posts With Music"},"checked_post_urls":{"items":{"type":"string"},"type":"array","title":"Checked Post Urls"}},"type":"object","required":["verdict","auto_add_music_enabled","photo_posts_checked","photo_posts_with_music","checked_post_urls"],"title":"TikTokMusicCheck","description":"What we learned by reading the account's own published posts back."},"TikTokMusicVerdict":{"type":"string","enum":["off","landing","not_landing","unknown"],"title":"TikTokMusicVerdict","description":"Whether TikTok is honouring the account's auto-add-music setting."},"TimeRange":{"properties":{"start":{"type":"number","minimum":0.0,"title":"Start","description":"Start time in the source video, seconds"},"end":{"type":"number","exclusiveMinimum":0.0,"title":"End","description":"End time in the source video, seconds"}},"type":"object","required":["start","end"],"title":"TimeRange","description":"A stretch of the source video worth keeping."},"Timeline":{"properties":{"video_tracks":{"items":{"$ref":"#/components/schemas/VideoTrack"},"type":"array","title":"Video Tracks"},"audio_tracks":{"anyOf":[{"items":{"$ref":"#/components/schemas/AudioTrack"},"type":"array"},{"type":"null"}],"title":"Audio Tracks"},"transitions":{"anyOf":[{"items":{"$ref":"#/components/schemas/Transition"},"type":"array"},{"type":"null"}],"title":"Transitions"},"overlays":{"anyOf":[{"items":{"anyOf":[{"$ref":"#/components/schemas/TextOverlay"},{"$ref":"#/components/schemas/ImageOverlay"}]},"type":"array"},{"type":"null"}],"title":"Overlays"}},"type":"object","required":["video_tracks"],"title":"Timeline","description":"Timeline containing tracks, transitions, and overlays."},"TitleOverlay":{"properties":{"text":{"type":"string","minLength":1,"title":"Text","description":"The words to show"},"start":{"type":"number","minimum":0.0,"title":"Start","description":"When it appears, in seconds on the finished cut"},"end":{"type":"number","exclusiveMinimum":0.0,"title":"End","description":"When it disappears, in seconds on the finished cut"},"anchor":{"type":"string","enum":["top_left","top","top_right","center_left","center","center_right","bottom_left","bottom","bottom_right"],"title":"Anchor","description":"Where on the frame it sits. Defaults to the top, because burned-in captions sit in the lower third.","default":"top"},"color":{"type":"string","title":"Color","description":"Text color, a CSS color name (e.g. teal) or #hex","default":"white"},"stroke_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stroke Color","description":"Outline color, a CSS color name or #hex. null for no outline","default":"black"}},"type":"object","required":["text","start","end"],"title":"TitleOverlay","description":"A line of text shown on screen for part of the cut, like a title card.\n\nTimes are on the FINISHED cut, not the source, because that is the clock the\nperson asking is looking at (\"at 0:09 of the recut\"). Each field maps 1:1\nonto an EditPlan text overlay."},"TokenExchangeResponse":{"properties":{"credentials":{"$ref":"#/components/schemas/AuthCredentials"},"app_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Name"}},"type":"object","required":["credentials"],"title":"TokenExchangeResponse"},"Topic":{"properties":{"title":{"type":"string","title":"Title","description":"A unique, specific topic title (2-5 words). Each title must be different."},"body":{"type":"string","title":"Body","description":"Instructions for creating posts on this topic. Focus on what the audience wants to learn, not what the business wants to promote (10-30 words)"},"category":{"type":"string","title":"Category","description":"Category of the content idea (1-3 words)","default":""}},"type":"object","required":["title","body"],"title":"Topic"},"TopicChange":{"properties":{"topic_id":{"type":"string","format":"uuid","title":"Topic Id","description":"The topic to change."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"New title."},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"New description."},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled","description":"Turn the topic on or off for generation."},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id","description":"Move it to this category, by id."},"category_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Name","description":"Move it to this category, by name (case-insensitive). Use instead of category_id."}},"additionalProperties":false,"type":"object","required":["topic_id"],"title":"TopicChange"},"TopicChangeError":{"properties":{"status_code":{"type":"integer","title":"Status Code"},"message":{"type":"string","title":"Message"}},"type":"object","required":["status_code","message"],"title":"TopicChangeError"},"TopicChangeResult":{"properties":{"index":{"type":"integer","title":"Index","description":"Position of the change in your request."},"topic_id":{"type":"string","title":"Topic Id"},"ok":{"type":"boolean","title":"Ok"},"revision_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revision Id","description":"Pass to revert_revisions to undo."},"topic":{"anyOf":[{"$ref":"#/components/schemas/TopicResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/TopicChangeError"},{"type":"null"}]}},"type":"object","required":["index","topic_id","ok"],"title":"TopicChangeResult"},"TopicCreateRequest":{"properties":{"title":{"type":"string","title":"Title","description":"Topic title"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"Topic description or notes"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id","description":"Category ID to group this topic under"},"enabled":{"type":"boolean","title":"Enabled","description":"Whether the topic is active for post generation","default":true}},"additionalProperties":false,"type":"object","required":["title"],"title":"TopicCreateRequest"},"TopicResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Topic ID"},"business_id":{"type":"string","title":"Business Id","description":"Business this topic belongs to"},"title":{"type":"string","title":"Title","description":"Topic title"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"Topic description or notes"},"enabled":{"type":"boolean","title":"Enabled","description":"Whether the topic is active for generation","default":true},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id","description":"Category ID"},"created_at":{"type":"string","title":"Created At","description":"When the topic was created"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At","description":"Last update time"},"revision_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revision Id","description":"Id of the undo record this write created. Pass it to revert_revisions to put the record back exactly as it was before this call. Set only on the response to a write; null when you read the record."}},"type":"object","required":["id","business_id","title","created_at"],"title":"TopicResponse"},"TopicUpdateRequest":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Topic title"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body","description":"Topic description"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id","description":"Category ID"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled","description":"Whether the topic is active"}},"additionalProperties":false,"type":"object","title":"TopicUpdateRequest"},"TopicsResult":{"properties":{"categories":{"items":{"type":"string"},"type":"array","title":"Categories","description":"4 distinct social media content pillars. No overlapping themes. Short single-phrase titles."},"topics":{"items":{"$ref":"#/components/schemas/Topic"},"type":"array","title":"Topics","description":"4 topics per category. Topics should be about what the AUDIENCE cares about — tips, education, industry insights, common problems — not product feature names. The business can tie posts back to their offering, but the topic itself should provide standalone value."}},"type":"object","required":["categories","topics"],"title":"TopicsResult","description":"LLM output schema for topic generation."},"TranscodeVideoWebhookPayload":{"properties":{"media_id":{"type":"string","title":"Media Id","description":"Media record ID"},"business_id":{"type":"string","title":"Business Id","description":"Business ID"},"type":{"type":"string","enum":["success","failure"],"title":"Type","description":"Webhook type: success or failure"},"final_storage_key":{"type":"string","title":"Final Storage Key","description":"Final storage key where Lambda uploaded the converted file"},"original_storage_key":{"type":"string","title":"Original Storage Key","description":"Original storage key"},"target_extension":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Extension","description":"Target file extension"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if type is failure"}},"type":"object","required":["media_id","business_id","type","final_storage_key","original_storage_key"],"title":"TranscodeVideoWebhookPayload","description":"Webhook payload from video transcoding Lambda."},"TranscribeResponse":{"properties":{"text":{"type":"string","title":"Text","description":"Full transcript text."},"words":{"anyOf":[{"items":{"$ref":"#/components/schemas/WordTiming"},"type":"array"},{"type":"null"}],"title":"Words","description":"Per-word timings. Populated when the caller requests `?words=true`. Used for burn-in caption rendering."}},"type":"object","required":["text"],"title":"TranscribeResponse"},"TransferOwnershipRequest":{"properties":{"new_owner_id":{"type":"string","title":"New Owner Id","description":"User ID of the new owner"}},"type":"object","required":["new_owner_id"],"title":"TransferOwnershipRequest"},"Transform":{"properties":{"fit":{"anyOf":[{"type":"string","enum":["cover","contain","stretch"]},{"type":"null"}],"title":"Fit"},"base_position":{"anyOf":[{"$ref":"#/components/schemas/NormalizedRect"},{"type":"null"}]},"zoom_pan":{"anyOf":[{"items":{"$ref":"#/components/schemas/ZoomPanKeyframe"},"type":"array"},{"type":"null"}],"title":"Zoom Pan"}},"type":"object","title":"Transform","description":"Transform settings for video clip."},"Transition":{"properties":{"id":{"type":"string","title":"Id"},"from_clip_id":{"type":"string","title":"From Clip Id"},"to_clip_id":{"type":"string","title":"To Clip Id"},"type":{"type":"string","enum":["cut","crossfade","fade_through_black","flash","swipe"],"title":"Type"},"duration":{"type":"number","title":"Duration"}},"type":"object","required":["id","from_clip_id","to_clip_id","type","duration"],"title":"Transition","description":"Transition between clips."},"TrendResponse":{"properties":{"id":{"type":"string","title":"Id"},"week_of":{"type":"string","title":"Week Of"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"how_to_use":{"type":"string","title":"How To Use"},"what_you_need":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"What You Need"},"suggested_creative_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Creative Type"},"heat_level":{"type":"integer","title":"Heat Level"},"category":{"type":"string","title":"Category"},"platforms":{"items":{"type":"string"},"type":"array","title":"Platforms"}},"type":"object","required":["id","week_of","title","description","how_to_use","what_you_need","suggested_creative_type","heat_level","category","platforms"],"title":"TrendResponse"},"TrendsResponse":{"properties":{"trends":{"items":{"$ref":"#/components/schemas/TrendResponse"},"type":"array","title":"Trends"}},"type":"object","required":["trends"],"title":"TrendsResponse"},"TweetMedia":{"properties":{"media_key":{"type":"string","title":"Media Key"},"type":{"type":"string","title":"Type"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"preview_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Image Url"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text"}},"type":"object","required":["media_key","type"],"title":"TweetMedia","description":"Media attached to a tweet."},"TweetMetrics":{"properties":{"like_count":{"type":"integer","title":"Like Count","default":0},"retweet_count":{"type":"integer","title":"Retweet Count","default":0},"reply_count":{"type":"integer","title":"Reply Count","default":0},"quote_count":{"type":"integer","title":"Quote Count","default":0}},"type":"object","title":"TweetMetrics","description":"Twitter metrics for a tweet."},"TweetResult":{"properties":{"id":{"type":"string","title":"Id"},"text":{"type":"string","title":"Text"},"author_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Id"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"url":{"type":"string","title":"Url"},"metrics":{"$ref":"#/components/schemas/TweetMetrics"},"media":{"items":{"$ref":"#/components/schemas/TweetMedia"},"type":"array","title":"Media","default":[]}},"type":"object","required":["id","text","url","metrics"],"title":"TweetResult","description":"A single tweet result."},"UndeployHtmlResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Status message"}},"type":"object","required":["message"],"title":"UndeployHtmlResponse","description":"Response from HTML undeployment.","examples":[{"message":"Resource undeployed successfully"}]},"UnregisterPushDeviceRequest":{"properties":{"device_token":{"type":"string","minLength":1,"title":"Device Token","description":"The device token to revoke."}},"type":"object","required":["device_token"],"title":"UnregisterPushDeviceRequest"},"UnschedulePostsRequest":{"properties":{"post_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":100,"minItems":1,"title":"Post Ids","description":"The posts to take off the schedule (fixed-time or queued)."},"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"The business the posts belong to. Defaults to the X-Business-Id header."}},"additionalProperties":false,"type":"object","required":["post_ids"],"title":"UnschedulePostsRequest"},"UnschedulePostsResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/UnscheduleResult"},"type":"array","title":"Results","description":"One entry per post, in the order you sent them."}},"type":"object","required":["results"],"title":"UnschedulePostsResponse"},"UnscheduleResult":{"properties":{"post_id":{"type":"string","title":"Post Id","description":"The post you asked to unschedule."},"ok":{"type":"boolean","title":"Ok","description":"True when the post is now unscheduled."},"error":{"anyOf":[{"type":"string","enum":["NOT_FOUND","NOT_SCHEDULED","POST_ALREADY_PUBLISHED"]},{"type":"null"}],"title":"Error","description":"Why this post was left alone. NOT_FOUND: no such post in this business. NOT_SCHEDULED: it was not scheduled or queued. POST_ALREADY_PUBLISHED: it already went out."},"revision_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revision Id","description":"Undo record for this post; revert it to put the schedule back."}},"type":"object","required":["post_id","ok"],"title":"UnscheduleResult","description":"What happened to one post in an unschedule call."},"UpcomingHolidaysRequest":{"properties":{"days_ahead":{"type":"integer","maximum":90.0,"minimum":1.0,"title":"Days Ahead","default":30},"country_code":{"type":"string","title":"Country Code","default":"US"}},"type":"object","title":"UpcomingHolidaysRequest"},"UpcomingHolidaysResponse":{"properties":{"holidays":{"items":{"$ref":"#/components/schemas/Holiday"},"type":"array","title":"Holidays"}},"type":"object","required":["holidays"],"title":"UpcomingHolidaysResponse"},"UpcomingMomentsResponse":{"properties":{"timezone":{"type":"string","title":"Timezone","description":"IANA timezone of the business's calendar (dates are local to it)."},"timezone_source":{"type":"string","enum":["business","unset_utc"],"title":"Timezone Source","description":"`business`: the business's own setting. `unset_utc`: none saved, so dates are UTC."},"today_local":{"type":"string","format":"date","title":"Today Local","description":"Today on the business's calendar."},"countries":{"items":{"type":"string"},"type":"array","title":"Countries","description":"Whose public holidays are included: the business's holiday setting, else its timezone's country, else US."},"moments":{"items":{"$ref":"#/components/schemas/Moment"},"type":"array","title":"Moments","description":"Upcoming moments by date. `type`: public (holiday), fun (marketing day or season start), event (the business's own). `days_until` 0 = today. `covered_post_ids`: posts already dated (pin or copy date) in the week up to it; empty = nothing planned. `estimated`: the date may move a day (Hijri calendar)."}},"type":"object","required":["timezone","timezone_source","today_local","countries","moments"],"title":"UpcomingMomentsResponse"},"UpdateBusinessRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"audience_combined":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience Combined"},"caption_writing_rules":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Writing Rules"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"ctas":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ctas"},"testimonials":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Testimonials"},"events":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Events"},"social_links":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Social Links"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"caption_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption Suffix"},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagline"},"header_font":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Header Font"},"body_font":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Body Font"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"palettes":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Palettes"},"preferences":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Preferences"},"whitelabel_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whitelabel Tier"},"logo_background_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Background Color"},"post_tank_settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Post Tank Settings"},"onboarding_tracking":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Onboarding Tracking"},"post_goal_weekly":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Post Goal Weekly"},"usage_goal_type":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Usage Goal Type"},"usage_goal_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Usage Goal Text"}},"type":"object","title":"UpdateBusinessRequest"},"UpdateDomainRequest":{"properties":{"domain":{"type":"string","title":"Domain","description":"The new domain for the organization"}},"type":"object","required":["domain"],"title":"UpdateDomainRequest"},"UpdateField":{"type":"string","enum":["tone","audience_combined","caption_writing_rules","ctas","caption_suffix","contact_phone","contact_email","website","description","industry"],"title":"UpdateField"},"UpdatePostsRequest":{"properties":{"items":{"anyOf":[{"items":{"$ref":"#/components/schemas/PostUpdateItem"},"type":"array","maxItems":50,"minItems":1},{"type":"null"}],"title":"Items","description":"Explicit edits, one per post, each like an update_post body plus post_id. Applied directly. Use this when you already know each post's new values."},"match":{"anyOf":[{"$ref":"#/components/schemas/RuleMatch"},{"type":"null"}],"description":"Rule mode: which posts the `set` rule applies to. Use with `set`, not with items."},"set":{"anyOf":[{"$ref":"#/components/schemas/RuleSet"},{"type":"null"}],"description":"Rule mode: the change to make in every matched post."},"dry_run":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dry Run","description":"Rule mode only. Default true: returns what would change and a confirm_token, and writes nothing. Send dry_run=false with that confirm_token to apply (sending the confirm_token alone also applies)."},"confirm_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirm Token","description":"Rule mode apply: the confirm_token from the dry run."}},"additionalProperties":false,"type":"object","title":"UpdatePostsRequest"},"UpdatePostsResponse":{"properties":{"confirm_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirm Token","description":"Rule dry run only. Send it back with dry_run=false to apply."},"dry_run":{"type":"boolean","title":"Dry Run"},"matched":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Matched","description":"Rule mode: unpublished posts that contain the find text."},"will_change":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Will Change","description":"Rule mode: how many of those the apply will change."},"changed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Changed","description":"Posts actually written by this call."},"skipped":{"items":{"$ref":"#/components/schemas/SkippedPost"},"type":"array","title":"Skipped"},"samples":{"items":{"$ref":"#/components/schemas/ReplaceSample"},"type":"array","title":"Samples"},"results":{"items":{"$ref":"#/components/schemas/ItemResult"},"type":"array","title":"Results"}},"type":"object","required":["dry_run"],"title":"UpdatePostsResponse"},"UpdateResourceTypeResponse":{"properties":{"resource_type_id":{"type":"string","title":"Resource Type Id","description":"ID of the resource type (new copy if was public)"},"is_copy":{"type":"boolean","title":"Is Copy","description":"Whether a new copy was created (true if original was public)"},"message":{"type":"string","title":"Message","description":"Status message describing the operation"}},"type":"object","required":["resource_type_id","is_copy","message"],"title":"UpdateResourceTypeResponse","description":"Response with updated resource type ID.","examples":[{"is_copy":true,"message":"Created business copy and updated 15 resources","resource_type_id":"new-uuid"}]},"UpdateSmsPreferencesRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Whether SMS notifications are enabled"},"events":{"items":{"type":"string"},"type":"array","title":"Events","description":"Event types to receive SMS for, e.g. ['failed_publish']"}},"type":"object","required":["enabled","events"],"title":"UpdateSmsPreferencesRequest"},"UpdateSmsPreferencesResponse":{"properties":{"updated":{"type":"boolean","title":"Updated"}},"type":"object","required":["updated"],"title":"UpdateSmsPreferencesResponse"},"UpdateSubscriptionRequest":{"properties":{"org_id":{"type":"string","title":"Org Id"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"extra_businesses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Extra Businesses"},"advanced_whitelabel_businesses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Advanced Whitelabel Businesses"},"reseller_whitelabel":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reseller Whitelabel"},"extra_channels":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Extra Channels"},"coupon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coupon"}},"additionalProperties":false,"type":"object","required":["org_id"],"title":"UpdateSubscriptionRequest"},"UpdateSubscriptionResponse":{"properties":{"checkout_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checkout Url"},"success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"}},"type":"object","title":"UpdateSubscriptionResponse"},"UpdateSystemPromptRequest":{"properties":{"business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Id","description":"The business whose system prompt to update. Optional only because the web FE names it via the X-Business-Id header; MCP/agent callers must pass it here."},"content":{"type":"string","title":"Content","description":"The full system prompt text. Markdown supported."}},"type":"object","required":["content"],"title":"UpdateSystemPromptRequest","description":"Request to replace a business's always-on Max system prompt."},"UpdateSystemPromptResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Confirmation message to relay to the user, including the new length."}},"type":"object","required":["message"],"title":"UpdateSystemPromptResponse","description":"Confirmation that the system prompt was saved."},"UpdateTopicsRequest":{"properties":{"changes":{"items":{"$ref":"#/components/schemas/TopicChange"},"type":"array","maxItems":100,"minItems":1,"title":"Changes","description":"One entry per topic to change. Only the fields you send change."},"new_categories":{"anyOf":[{"items":{"$ref":"#/components/schemas/NewCategoryRequest"},"type":"array","maxItems":20},{"type":"null"}],"title":"New Categories","description":"Categories to create first, so changes can name them."}},"additionalProperties":false,"type":"object","required":["changes"],"title":"UpdateTopicsRequest"},"UpdateTopicsResponse":{"properties":{"categories_created":{"items":{"$ref":"#/components/schemas/CategoryResponse"},"type":"array","title":"Categories Created","description":"Categories this call created (names that already existed are reused, not listed)."},"results":{"items":{"$ref":"#/components/schemas/TopicChangeResult"},"type":"array","title":"Results","description":"One entry per change, in order."}},"type":"object","required":["categories_created","results"],"title":"UpdateTopicsResponse"},"UploadExternalImageRequest":{"properties":{"image_url":{"type":"string","title":"Image Url","description":"External image URL to proxy and upload"}},"type":"object","required":["image_url"],"title":"UploadExternalImageRequest"},"UploadImageFromUrlRequest":{"properties":{"business_id":{"type":"string","title":"Business Id","description":"Business ID for organizing storage"},"image_url":{"type":"string","title":"Image Url","description":"Public http(s) URL of the image to fetch and store"},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text","description":"Alt text for the image (optional)"},"resource_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Id","description":"Resource ID to link the image to (optional). Creates a resource_images junction record."},"skip_processing":{"type":"boolean","title":"Skip Processing","description":"Skip all processing (resize, crop, compress). Use when the image is already final.","default":false},"max_dimension":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Dimension","description":"Maximum dimension (width or height) in pixels. Maintains aspect ratio. Defaults to 2048."}},"type":"object","required":["business_id","image_url"],"title":"UploadImageFromUrlRequest","description":"JSON body for the agent-facing image upload."},"UploadImageResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Image record ID"},"url":{"type":"string","title":"Url","description":"Public URL of the uploaded image"},"storage_path":{"type":"string","title":"Storage Path","description":"Storage path in Supabase storage"},"width":{"type":"integer","title":"Width","description":"Image width in pixels"},"height":{"type":"integer","title":"Height","description":"Image height in pixels"},"template_use":{"anyOf":[{"$ref":"#/components/schemas/TemplateUseInfo"},{"type":"null"}],"description":"Whether the image suits a design template as a background photo (graphic, low_resolution). Always None on the upload response — the check runs in the background and arrives over Realtime."}},"type":"object","required":["id","url","storage_path","width","height"],"title":"UploadImageResponse","description":"Response for image upload.","examples":[{"height":1080,"id":"img-123","storage_path":"businesses/biz-123/images/img-123.jpg","url":"https://...","width":1920}]},"UploadThumbnailResponse":{"properties":{"poster_url":{"type":"string","title":"Poster Url"}},"additionalProperties":false,"type":"object","required":["poster_url"],"title":"UploadThumbnailResponse"},"UserWebhookPayload":{"properties":{"type":{"type":"string","title":"Type"},"table":{"type":"string","title":"Table"},"schema_name":{"type":"string","title":"Schema Name"},"record":{"$ref":"#/components/schemas/UserWebhookRecord"},"old_record":{"anyOf":[{"$ref":"#/components/schemas/UserWebhookRecord"},{"type":"null"}]}},"type":"object","required":["type","table","schema_name","record"],"title":"UserWebhookPayload"},"UserWebhookRecord":{"properties":{"id":{"type":"string","title":"Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"given_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Given Name"},"family_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Family Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"picture":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Picture"},"manages_multiple_brands":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Manages Multiple Brands"}},"type":"object","required":["id"],"title":"UserWebhookRecord"},"UserWebhookRequest":{"properties":{"payload":{"$ref":"#/components/schemas/UserWebhookPayload"}},"type":"object","required":["payload"],"title":"UserWebhookRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VapidPublicKeyResponse":{"properties":{"public_key":{"type":"string","title":"Public Key","description":"base64url VAPID public key for pushManager.subscribe()."}},"type":"object","required":["public_key"],"title":"VapidPublicKeyResponse"},"VideoAsset":{"properties":{"id":{"type":"string","title":"Id"},"uri":{"type":"string","title":"Uri"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/VideoAssetMetadata"},{"type":"null"}]}},"type":"object","required":["id","uri"],"title":"VideoAsset","description":"Video asset definition."},"VideoAssetMetadata":{"properties":{"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"},"fps":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fps"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"}},"type":"object","title":"VideoAssetMetadata","description":"Metadata for video assets."},"VideoClip":{"properties":{"id":{"type":"string","title":"Id"},"asset_id":{"type":"string","title":"Asset Id"},"source_start":{"type":"number","title":"Source Start"},"source_end":{"type":"number","title":"Source End"},"timeline_start":{"type":"number","title":"Timeline Start"},"playback_speed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Playback Speed","default":1.0},"transform":{"anyOf":[{"$ref":"#/components/schemas/Transform"},{"type":"null"}]},"effects":{"anyOf":[{"items":{"$ref":"#/components/schemas/Effect"},"type":"array"},{"type":"null"}],"title":"Effects"}},"type":"object","required":["id","asset_id","source_start","source_end","timeline_start"],"title":"VideoClip","description":"Video clip on timeline."},"VideoComponent":{"properties":{"type":{"type":"string","const":"video","title":"Type","default":"video"},"id":{"type":"string","title":"Id"},"x":{"type":"number","title":"X","default":0.0},"y":{"type":"number","title":"Y","default":0.0},"rotation":{"type":"number","title":"Rotation","default":0.0},"src":{"type":"string","title":"Src"},"startTime":{"type":"number","title":"Starttime","default":0},"endTime":{"type":"number","title":"Endtime","default":1},"shadowEnabled":{"type":"boolean","title":"Shadowenabled","default":false},"shadowBlur":{"type":"number","title":"Shadowblur","default":5},"shadowOffsetX":{"type":"number","title":"Shadowoffsetx","default":0},"shadowOffsetY":{"type":"number","title":"Shadowoffsety","default":0},"shadowColor":{"type":"string","title":"Shadowcolor","default":"black"},"shadowOpacity":{"type":"number","title":"Shadowopacity","default":1},"name":{"type":"string","title":"Name","default":""},"filters":{"additionalProperties":true,"type":"object","title":"Filters","default":{}},"width":{"type":"number","title":"Width","default":100.0},"height":{"type":"number","title":"Height","default":100.0},"cropX":{"type":"number","title":"Cropx","default":0},"cropY":{"type":"number","title":"Cropy","default":0},"cropWidth":{"type":"number","title":"Cropwidth","default":1},"cropHeight":{"type":"number","title":"Cropheight","default":1},"borderColor":{"type":"string","title":"Bordercolor","default":"black"},"borderSize":{"type":"number","title":"Bordersize","default":0},"flipX":{"type":"boolean","title":"Flipx","default":false},"flipY":{"type":"boolean","title":"Flipy","default":false},"selectable":{"type":"boolean","title":"Selectable","default":true},"alwaysOnTop":{"type":"boolean","title":"Alwaysontop","default":false},"showInExport":{"type":"boolean","title":"Showinexport","default":true},"draggable":{"type":"boolean","title":"Draggable","default":true},"contentEditable":{"type":"boolean","title":"Contenteditable","default":true},"removable":{"type":"boolean","title":"Removable","default":true},"resizable":{"type":"boolean","title":"Resizable","default":true},"animations":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Animations","default":[]}},"type":"object","required":["src"],"title":"VideoComponent"},"VideoProcessingWebhookPayload":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Task ID for tracking"},"business_id":{"type":"string","title":"Business Id","description":"Business ID"},"type":{"type":"string","title":"Type","description":"Webhook type: progress, success, or failure"},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress","description":"Progress percentage (0-100)"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Progress message"},"video_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Base64","description":"Base64-encoded video bytes"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if type is failure"}},"type":"object","required":["task_id","business_id","type"],"title":"VideoProcessingWebhookPayload","description":"Webhook payload from video processing Lambda."},"VideoProcessingWebhookResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Webhook processing status"},"result_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Url","description":"URL of the processed video (if successful)"}},"type":"object","required":["status"],"title":"VideoProcessingWebhookResponse","description":"Response from video processing webhook.","examples":[{"result_url":"https://...","status":"ok"}]},"VideoTrack":{"properties":{"id":{"type":"string","title":"Id"},"clips":{"items":{"$ref":"#/components/schemas/VideoClip"},"type":"array","title":"Clips"}},"type":"object","required":["id","clips"],"title":"VideoTrack","description":"Video track containing clips."},"VideoTransformRequest":{"properties":{"video_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Video Url","description":"URL of the source video"},"business_id":{"type":"string","title":"Business Id","description":"Business ID for task tracking and storage"},"transforms":{"items":{"oneOf":[{"$ref":"#/components/schemas/SpeedupTransform"},{"$ref":"#/components/schemas/SilenceRemovalTransform"}],"discriminator":{"propertyName":"type","mapping":{"remove_silence":"#/components/schemas/SilenceRemovalTransform","speedup":"#/components/schemas/SpeedupTransform"}}},"type":"array","minItems":1,"title":"Transforms","description":"Ordered list of transforms to apply"}},"type":"object","required":["video_url","business_id","transforms"],"title":"VideoTransformRequest","description":"Request to apply transforms to a video."},"VideoTransformWebhookPayload":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Task ID for tracking"},"business_id":{"type":"string","title":"Business Id","description":"Business ID"},"type":{"type":"string","enum":["progress","success","failure"],"title":"Type","description":"Webhook type"},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress","description":"Progress percentage (0-100)"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Progress message"},"storage_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Key","description":"Storage key of transformed video (legacy, Supabase)"},"result_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Url","description":"Direct URL of transformed video (S3/CloudFront)"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds","description":"Duration of output video"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if type is failure"}},"type":"object","required":["task_id","business_id","type"],"title":"VideoTransformWebhookPayload","description":"Webhook payload from video transform Lambda."},"Voice":{"properties":{"voice_id":{"type":"string","title":"Voice Id","description":"Voice ID"},"name":{"type":"string","title":"Name","description":"Voice name"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Voice category (e.g., 'premade')"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Voice description"},"preview_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Url","description":"Preview audio URL"},"samples":{"items":{"$ref":"#/components/schemas/VoiceSample"},"type":"array","title":"Samples","description":"List of voice samples"}},"type":"object","required":["voice_id","name"],"title":"Voice","description":"Voice model."},"VoiceField":{"type":"string","enum":["tone","caption_writing_rules","caption_suffix"],"title":"VoiceField"},"VoiceSample":{"properties":{"sample_id":{"type":"string","title":"Sample Id","description":"Sample ID"},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name","description":"File name"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type","description":"MIME type"}},"type":"object","required":["sample_id"],"title":"VoiceSample","description":"Voice sample model."},"VolumeKeyframe":{"properties":{"time":{"type":"number","title":"Time"},"gain_db":{"type":"number","title":"Gain Db"}},"type":"object","required":["time","gain_db"],"title":"VolumeKeyframe","description":"Volume keyframe for audio envelope."},"WebSearchRequest":{"properties":{"query":{"type":"string","minLength":1,"title":"Query","description":"Search query. Be specific about location for local content."},"include_domains":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Include Domains","description":"Optional domains to restrict results to (e.g. [\"nytimes.com\"]). Filters by DOMAIN, so a whole site is allowed, not one channel or author on it. Do not use this to look up how Marky itself works."},"max_results":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Max Results","description":"Maximum number of results to return.","default":5}},"type":"object","required":["query"],"title":"WebSearchRequest","description":"Request to search the web."},"WebSearchResponse":{"properties":{"query":{"type":"string","title":"Query"},"results":{"items":{"$ref":"#/components/schemas/WebSearchResult"},"type":"array","title":"Results"}},"type":"object","required":["query","results"],"title":"WebSearchResponse","description":"Full response from a web search query."},"WebSearchResult":{"properties":{"title":{"type":"string","title":"Title"},"url":{"type":"string","title":"Url"},"content":{"type":"string","title":"Content"},"score":{"type":"number","title":"Score"}},"type":"object","required":["title","url","content","score"],"title":"WebSearchResult","description":"A single web search result."},"WebhookCreateRequest":{"properties":{"url":{"type":"string","title":"Url","description":"HTTPS URL to receive webhook events"},"events":{"items":{"type":"string","const":"post.published"},"type":"array","title":"Events","description":"Events to subscribe to"}},"additionalProperties":false,"type":"object","required":["url","events"],"title":"WebhookCreateRequest"},"WebhookDeliveryResponse":{"properties":{"id":{"type":"string","title":"Id"},"event":{"type":"string","title":"Event"},"post_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Id"},"status_code":{"anyOf":[{"type":"integer","format":"int32"},{"type":"null"}],"title":"Status Code"},"response_time_ms":{"anyOf":[{"type":"integer","format":"int32"},{"type":"null"}],"title":"Response Time Ms"},"attempt":{"type":"integer","format":"int32","title":"Attempt"},"success":{"type":"boolean","title":"Success"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","event","post_id","status_code","response_time_ms","attempt","success","error","created_at"],"title":"WebhookDeliveryResponse"},"WebhookResponse":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"org_id":{"type":"string","title":"Org Id"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret","description":"Signing secret (only shown on creation)"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","url","events","org_id","created_at"],"title":"WebhookResponse"},"WebhookRun":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"extra":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra"}},"type":"object","title":"WebhookRun","description":"One run out of the batch LangSmith matched.\n\n`extra` is optional on purpose: LangSmith's own documented example payload shows\n`\"extra\": null`, so the thread id is NOT reliably inline. When it is missing we\nkeep the run id and look the thread up afterwards."},"WordTiming":{"properties":{"word":{"type":"string","title":"Word","description":"Punctuated word as it appears in the transcript."},"start":{"type":"number","title":"Start","description":"Start time in seconds."},"end":{"type":"number","title":"End","description":"End time in seconds."}},"type":"object","required":["word","start","end"],"title":"WordTiming"},"WorkspaceChannelUsage":{"properties":{"business_id":{"type":"string","title":"Business Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"connected_count":{"type":"integer","title":"Connected Count"}},"type":"object","required":["business_id","name","connected_count"],"title":"WorkspaceChannelUsage"},"WorkspaceStats":{"properties":{"workspace_id":{"type":"string","title":"Workspace Id"},"name":{"type":"string","title":"Name"},"rank":{"type":"integer","title":"Rank","default":0},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"workspace_icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Icon"},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Name"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"totals":{"additionalProperties":{"type":"integer"},"type":"object","title":"Totals"},"previous_totals":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Previous Totals"},"socials":{"items":{"type":"string"},"type":"array","title":"Socials"},"platforms":{"items":{"$ref":"#/components/schemas/PlatformStats"},"type":"array","title":"Platforms"}},"type":"object","required":["workspace_id","name","totals","socials","platforms"],"title":"WorkspaceStats"},"WorkspaceUsageSummary":{"properties":{"posts":{"type":"integer","title":"Posts"},"writes":{"type":"integer","title":"Writes"},"url_writes":{"type":"integer","title":"Url Writes"},"cost_cents":{"type":"number","title":"Cost Cents"},"cap_cents":{"type":"integer","title":"Cap Cents"},"remaining_cents":{"type":"number","title":"Remaining Cents"}},"type":"object","required":["posts","writes","url_writes","cost_cents","cap_cents","remaining_cents"],"title":"WorkspaceUsageSummary","description":"Current-month X usage for one workspace, for the in-app usage view."},"XUsageStatus":{"properties":{"billing_enabled":{"type":"boolean","title":"Billing Enabled"},"has_card":{"type":"boolean","title":"Has Card"},"consent_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Consent At"},"summary":{"$ref":"#/components/schemas/WorkspaceUsageSummary"},"viewer_is_whitelabel_client":{"type":"boolean","title":"Viewer Is Whitelabel Client"},"business_has_whitelabel_client":{"type":"boolean","title":"Business Has Whitelabel Client"},"agency_enabled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agency Enabled At"}},"type":"object","required":["billing_enabled","has_card","consent_at","summary","viewer_is_whitelabel_client","business_has_whitelabel_client","agency_enabled_at"],"title":"XUsageStatus","description":"Everything the frontend needs for the X connect gate + usage view."},"ZoomPanKeyframe":{"properties":{"time":{"type":"number","title":"Time"},"rect":{"$ref":"#/components/schemas/NormalizedRect"}},"type":"object","required":["time","rect"],"title":"ZoomPanKeyframe","description":"Keyframe for zoom/pan animation."},"src__modules__reviews__gmb__BusinessReviewsResponse":{"properties":{"reviews":{"items":{"$ref":"#/components/schemas/ReviewWithMetadata"},"type":"array","title":"Reviews","description":"List of reviews"},"average_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Rating","description":"Average rating"},"total_review_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Review Count","description":"Total review count"},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pagination token"},"location_name":{"type":"string","title":"Location Name","description":"GMB location name"},"integration_username":{"type":"string","title":"Integration Username","description":"Connected GMB account username"}},"type":"object","required":["reviews","average_rating","total_review_count","next_page_token","location_name","integration_username"],"title":"BusinessReviewsResponse","description":"Response for business reviews with metadata."},"src__routes__ai__TaskStatusResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"type":"string","title":"Status"},"progress":{"type":"integer","title":"Progress","default":0},"progress_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress Message"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result","description":"Task result data (when completed)"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["task_id","status"],"title":"TaskStatusResponse"},"src__routes__api_v1__PostStatsResponse":{"properties":{"post_id":{"type":"string","title":"Post Id","description":"Marky post ID"},"platforms":{"items":{"$ref":"#/components/schemas/PlatformPostStats"},"type":"array","title":"Platforms","description":"Per-platform stats"},"skipped":{"items":{"$ref":"#/components/schemas/PlatformPostStatsError"},"type":"array","title":"Skipped","description":"Platforms we could not fetch stats for (no success, expired token, etc.)"}},"type":"object","required":["post_id"],"title":"PostStatsResponse"},"src__routes__api_v1__reviews__BusinessReviewsResponse":{"properties":{"reviews":{"items":{"$ref":"#/components/schemas/ReviewResponse"},"type":"array","title":"Reviews","description":"The reviews on this page"},"average_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Rating","description":"Average star rating across all reviews (Google-reported)"},"total_review_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Review Count","description":"Total number of reviews on the location (Google-reported)"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Cursor for the next page. Null when there are no more reviews. Pass as the `cursor` query param."}},"type":"object","required":["reviews"],"title":"BusinessReviewsResponse","description":"A page of Google Business reviews for a business, with summary stats.\n\nPagination is cursor-style: when `next_cursor` is non-null there are more\nreviews — pass it back as the `cursor` query param to fetch the next page."},"src__routes__integrations__socials__analytics__PostStatsResponse":{"properties":{"platform":{"type":"string","title":"Platform","description":"Platform where the post lives"},"post_id":{"type":"string","title":"Post Id","description":"Identifier of the post being analyzed"},"metrics":{"items":{"$ref":"#/components/schemas/PostMetric"},"type":"array","title":"Metrics","description":"List of metrics for the post"}},"type":"object","required":["platform","post_id"],"title":"PostStatsResponse","description":"Response payload for per-post analytics.","examples":[{"metrics":[],"platform":"instagram","post_id":"post-123"}]},"src__routes__integrations__socials__analytics__PostWithStats":{"properties":{"id":{"type":"string","title":"Id","description":"Post ID"},"timestamp":{"type":"string","title":"Timestamp","description":"Creation timestamp"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption","description":"Post caption"},"permalink":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink","description":"Post URL"},"media_type":{"type":"string","title":"Media Type","description":"Type of media (IMAGE, VIDEO, CAROUSEL_ALBUM)"},"media_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Url","description":"URL to media"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"URL to thumbnail"},"stats":{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"object","title":"Stats","description":"Post statistics (likes, comments, reach, etc.). A null value means Instagram would not report that metric — e.g. posts made before the account became a business account — NOT that the metric is zero."}},"type":"object","required":["id","timestamp","media_type","stats"],"title":"PostWithStats","description":"A post with its associated statistics."},"src__routes__post_generation__TaskStatusResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"type":"string","title":"Status"},"progress":{"type":"integer","title":"Progress","default":0},"progress_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress Message"},"posts":{"anyOf":[{"items":{"$ref":"#/components/schemas/PostResult"},"type":"array"},{"type":"null"}],"title":"Posts"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"}},"type":"object","required":["task_id","status"],"title":"TaskStatusResponse"},"src__vendors__socials__analytics_models__PostWithStats":{"properties":{"publish_id":{"type":"string","title":"Publish Id"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"created_time":{"type":"string","title":"Created Time"},"caption":{"type":"string","title":"Caption","default":""},"permalink_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"media_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Url"},"media_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Media Urls"},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text"},"media_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Type"},"stats":{"$ref":"#/components/schemas/PostStats"},"type":{"$ref":"#/components/schemas/PostType","default":"Unknown"}},"type":"object","required":["publish_id","created_time","stats"],"title":"PostWithStats","description":"A social media post with its associated statistics.\n\nData-source agnostic: works for API fetches and local DB reads."},"ErrorEnvelope":{"description":"The body of every non-2xx response.\n\n`detail` is retained on internal routes for backward-compatibility while the\nfrontend migrates to reading `error.code`.","properties":{"error":{"$ref":"#/components/schemas/ErrorDetail"}},"required":["error"],"title":"ErrorEnvelope","type":"object"},"Problem":{"type":"object","description":"RFC 9457 Problem Details. Returned as application/problem+json to clients pinned to 2026-07-17 or later. Match on the stable `code`, never on text.","properties":{"type":{"type":"string","format":"uri","description":"URI for the problem type; dereferences to the docs entry for `code`."},"title":{"type":"string","description":"Short human-readable summary of the problem type (the broad error category)."},"status":{"type":"integer","description":"The HTTP status code, repeated in the body."},"detail":{"type":"string","description":"Explanation specific to this occurrence. Display/logging only — do not parse."},"instance":{"type":"string","description":"The request path that produced this problem."},"code":{"$ref":"#/components/schemas/ErrorCode"},"request_id":{"type":"string","description":"Id of this request (also the X-Request-Id header). Quote it to support."},"param":{"type":"string","description":"The offending request field, when the problem is field-specific."}},"required":["type","title","status","detail","code"]}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer","description":"Bearer an mk_live_ API key. A key is ORG-SCOPED: it grants full access to every resource in that organization, with no per-endpoint scoping (see the `uid` pseudo-permission on each operation). Manage keys at https://app.mymarky.ai."}}},"tags":[{"name":"businesses","description":"Set up and manage the brand profiles (businesses) Marky works for — the account every post, asset, and connection belongs to."},{"name":"posts","description":"Generate, schedule, queue, and publish on-brand posts — the core job of getting a batch of quality content out the door."},{"name":"library","description":"Store and organize the media, files, folders, and templates your posts draw from, so on-brand assets are ready when you create."},{"name":"integrations","description":"Connect social accounts and read how published posts performed on each platform."},{"name":"topics","description":"Manage the topics and categories that steer what Marky writes about, keeping generated content on-message."},{"name":"webhooks","description":"Subscribe to events so your own systems react the moment a post publishes or changes."},{"name":"keys","description":"Create and revoke the API keys that authenticate your integration."}]}