{"openapi":"3.1.0","info":{"title":"LazyRelay API","version":"1.0.0","summary":"Schedule and publish social posts on every platform, with independent proof each one went live.","description":"Authenticate with an API key from the dashboard (the API Keys tab): send `Authorization: Bearer lzr_live_...`. This document lists what an API key can do. Managing API keys, team members, billing, webhooks and DM automations needs a person signed in to the dashboard and is not in the API. Webhook endpoints are created in the dashboard (Settings, Webhooks); see https://lazyrelay.com/docs for how to verify their signature.","contact":{"name":"LazyRelay","url":"https://lazyrelay.com/contact"}},"servers":[{"url":"https://lazyrelaylazyrelay-backend.onrender.com/api","description":"Production"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Accounts","description":"Connected social accounts, brands, and per-platform lookups (Pinterest boards, TikTok settings)."},{"name":"Platforms","description":"What each platform accepts, before you post."},{"name":"Posts","description":"Schedule, publish, edit, approve and cancel posts, and read Proof-of-Publish."},{"name":"Drafts","description":"Save a post without an account or time, then schedule it later."},{"name":"Media","description":"Upload images, videos and PDFs to get a public URL for a post."},{"name":"Scheduling","description":"Saved posting times, the next free slot, and weekly repeating posts."},{"name":"Content","description":"Saved snippets and RSS feeds that turn new items into drafts."},{"name":"Client review","description":"Links a client opens, with no account, to approve posts and comment, and the conversation on each post."},{"name":"Analytics","description":"Results, engagement, and comments on your posts."},{"name":"Public","description":"Endpoints that need no API key: proof pages and the client review page."}],"paths":{"/social-accounts":{"get":{"operationId":"listSocialAccounts","tags":["Accounts"],"summary":"List connected social accounts","responses":{"200":{"description":"The connected accounts.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SocialAccount"}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/social-accounts/{id}/boards":{"get":{"operationId":"listPinterestBoards","tags":["Accounts"],"summary":"List a Pinterest account's boards","parameters":[{"name":"id","in":"path","required":true,"description":"A Pinterest account id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: a plan limit, or this key may not do that.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/social-accounts/{id}/tiktok-creator-info":{"get":{"operationId":"getTikTokCreatorInfo","tags":["Accounts"],"summary":"What a TikTok account allows (privacy levels, interactions, longest video)","parameters":[{"name":"id","in":"path","required":true,"description":"A TikTok account id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: a plan limit, or this key may not do that.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/platforms":{"get":{"operationId":"listPlatforms","tags":["Platforms"],"summary":"Every supported platform and whether it is available","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/platforms/rules":{"get":{"operationId":"getPlatformRules","tags":["Platforms"],"summary":"What each platform accepts, before you post","description":"Text limit, image and video rules, how many images per post, required fields (for example TikTok's privacy level and Pinterest's board), features and the options each platform reads.","parameters":[{"name":"platform","in":"query","required":false,"description":"instagram, facebook, tiktok, youtube, pinterest, linkedin, threads, bluesky, mastodon, x, tumblr, telegram, discord, wordpress, devto, hashnode, lemmy, slack, nostr, whop","schema":{"type":"string"}}],"responses":{"200":{"description":"One entry per platform.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformRules"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduled-posts":{"get":{"operationId":"listScheduledPosts","tags":["Posts"],"summary":"List upcoming posts and the most recent finished ones","responses":{"200":{"description":"Posts, with post_results (Proof-of-Publish).","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Post"}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"schedulePost","tags":["Posts"],"summary":"Schedule a post to one connected account","description":"Call once per account to post to several. Checks the platform's rules now, so an error says what to fix. Poll GET /scheduled-posts and read post_results[0].verified_live to confirm it really went live.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostInput"}}}},"responses":{"200":{"description":"The created post.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: a plan limit, or this key may not do that.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduled-posts/history":{"get":{"operationId":"listPostHistory","tags":["Posts"],"summary":"Older finished posts, a page at a time","parameters":[{"name":"before","in":"query","required":false,"description":"ISO time: only posts older than this","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100}}],"responses":{"200":{"description":"Posts.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Post"}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduled-posts/bulk":{"post":{"operationId":"bulkSchedulePosts","tags":["Posts"],"summary":"Schedule up to 200 posts in one call","description":"Each row is checked like a single post; one bad row does not stop the others.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["posts"],"properties":{"posts":{"type":"array","maxItems":200,"items":{"$ref":"#/components/schemas/PostInput"}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduled-posts/draft":{"post":{"operationId":"createDraft","tags":["Drafts"],"summary":"Save a draft with no account or time yet","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftInput"}}}},"responses":{"200":{"description":"The draft.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: a plan limit, or this key may not do that.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduled-posts/{id}":{"patch":{"operationId":"editPost","tags":["Posts"],"summary":"Edit a draft, a post waiting for approval, or a pending post","parameters":[{"name":"id","in":"path","required":true,"description":"The post id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostEditInput"}}}},"responses":{"200":{"description":"The post.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict: for example the post is no longer in a state that allows this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deletePost","tags":["Posts"],"summary":"Cancel a pending or waiting post, or clear a finished one","parameters":[{"name":"id","in":"path","required":true,"description":"The post id","schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict: for example the post is no longer in a state that allows this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduled-posts/{id}/schedule":{"patch":{"operationId":"scheduleDraft","tags":["Drafts"],"summary":"Turn a draft into a scheduled post","parameters":[{"name":"id","in":"path","required":true,"description":"The post id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleDraftInput"}}}},"responses":{"200":{"description":"The post.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: a plan limit, or this key may not do that.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict: for example the post is no longer in a state that allows this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduled-posts/{id}/approve":{"patch":{"operationId":"approvePost","tags":["Posts"],"summary":"Approve a post that is waiting for approval","parameters":[{"name":"id","in":"path","required":true,"description":"The post id","schema":{"type":"string"}}],"responses":{"200":{"description":"The post, now pending.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduled-posts/{id}/pause":{"patch":{"operationId":"pausePost","tags":["Posts"],"summary":"Pause a pending post","parameters":[{"name":"id","in":"path","required":true,"description":"The post id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict: for example the post is no longer in a state that allows this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduled-posts/{id}/resume":{"patch":{"operationId":"resumePost","tags":["Posts"],"summary":"Resume a paused post","parameters":[{"name":"id","in":"path","required":true,"description":"The post id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict: for example the post is no longer in a state that allows this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduled-posts/{id}/reschedule":{"patch":{"operationId":"reschedulePost","tags":["Posts"],"summary":"Move a pending post to a new time (the current time posts right away)","parameters":[{"name":"id","in":"path","required":true,"description":"The post id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["scheduledFor"],"properties":{"scheduledFor":{"type":"string","format":"date-time"}}}}}},"responses":{"200":{"description":"The post.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict: for example the post is no longer in a state that allows this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduled-posts/{id}/duplicate":{"post":{"operationId":"duplicatePost","tags":["Posts"],"summary":"Copy a post to a new time","parameters":[{"name":"id","in":"path","required":true,"description":"The post id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["scheduledFor"],"properties":{"scheduledFor":{"type":"string","format":"date-time"},"requiresApproval":{"type":"boolean"}}}}}},"responses":{"200":{"description":"The new post.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: a plan limit, or this key may not do that.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduled-posts/{id}/proof-link":{"get":{"operationId":"getProofLink","tags":["Posts"],"summary":"A public proof-of-publish link for a post confirmed live","description":"The API key must be allowed to share proof (a per-key setting in the dashboard).","parameters":[{"name":"id","in":"path","required":true,"description":"The post id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: a plan limit, or this key may not do that.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/scheduled-posts/{id}/review-comments":{"get":{"operationId":"listReviewComments","tags":["Client review"],"summary":"The client conversation on a post","parameters":[{"name":"id","in":"path","required":true,"description":"The post id","schema":{"type":"string"}}],"responses":{"200":{"description":"Comments.","content":{"application/json":{"schema":{"type":"object","properties":{"comments":{"type":"array","items":{"$ref":"#/components/schemas/ReviewComment"}}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"addReviewComment","tags":["Client review"],"summary":"Reply in the client conversation","parameters":[{"name":"id","in":"path","required":true,"description":"The post id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["body"],"properties":{"body":{"type":"string","maxLength":1000}}}}}},"responses":{"200":{"description":"The comment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewComment"}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/review-links":{"get":{"operationId":"listReviewLinks","tags":["Client review"],"summary":"Client review links and how many the plan allows","responses":{"200":{"description":"Links.","content":{"application/json":{"schema":{"type":"object","properties":{"maxLinks":{"type":"integer"},"links":{"type":"array","items":{"$ref":"#/components/schemas/ReviewLink"}}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createReviewLink","tags":["Client review"],"summary":"Create a link a client opens, with no account, to approve posts and comment","description":"The client opens https://lazyrelay.com/review/{token}. Needs a plan that includes review links.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string"},"brandLabel":{"type":"string"},"expiresInDays":{"type":"integer","minimum":1,"maximum":90}}}}}},"responses":{"200":{"description":"The link.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewLink"}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: a plan limit, or this key may not do that.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/review-links/{id}":{"delete":{"operationId":"revokeReviewLink","tags":["Client review"],"summary":"Stop a review link working at once","parameters":[{"name":"id","in":"path","required":true,"description":"The link id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/media":{"get":{"operationId":"listMedia","tags":["Media"],"summary":"Uploaded files","responses":{"200":{"description":"Files.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MediaItem"}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/media/usage":{"get":{"operationId":"getMediaUsage","tags":["Media"],"summary":"Storage used and the plan's limit","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/media/upload":{"post":{"operationId":"uploadMedia","tags":["Media"],"summary":"Upload an image, video or PDF and get a public URL to use in a post","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"},"altText":{"type":"string","maxLength":1000}}}}}},"responses":{"200":{"description":"The file.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"altText":{"type":["string","null"]}}}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/media/{id}":{"patch":{"operationId":"editMediaAltText","tags":["Media"],"summary":"Change a file's alt text","parameters":[{"name":"id","in":"path","required":true,"description":"The file id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"altText":{"type":["string","null"]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteMedia","tags":["Media"],"summary":"Delete an uploaded file (refused while a pending post uses it)","parameters":[{"name":"id","in":"path","required":true,"description":"The file id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict: for example the post is no longer in a state that allows this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/posting-slots":{"get":{"operationId":"listPostingSlots","tags":["Scheduling"],"summary":"Saved posting times","responses":{"200":{"description":"Slots.","content":{"application/json":{"schema":{"type":"object","properties":{"maxSlots":{"type":"integer"},"slots":{"type":"array","items":{"$ref":"#/components/schemas/PostingSlot"}}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createPostingSlot","tags":["Scheduling"],"summary":"Save a posting time","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["daysOfWeek","timeOfDay","timezone"],"properties":{"daysOfWeek":{"type":"array","items":{"type":"integer","minimum":1,"maximum":7}},"timeOfDay":{"type":"string","example":"09:00"},"timezone":{"type":"string","example":"Africa/Johannesburg"}}}}}},"responses":{"200":{"description":"The slot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostingSlot"}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/posting-slots/{id}":{"delete":{"operationId":"deletePostingSlot","tags":["Scheduling"],"summary":"Remove a posting time","parameters":[{"name":"id","in":"path","required":true,"description":"The slot id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/posting-slots/next":{"get":{"operationId":"getNextFreeSlot","tags":["Scheduling"],"summary":"The next free posting time for an account, to use as scheduledFor","parameters":[{"name":"socialAccountId","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"A time.","content":{"application/json":{"schema":{"type":"object","properties":{"scheduledFor":{"type":"string","format":"date-time"}}}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/recurring-schedules":{"get":{"operationId":"listRecurringSchedules","tags":["Scheduling"],"summary":"Weekly repeating posts","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createRecurringSchedule","tags":["Scheduling"],"summary":"Post the same thing on chosen weekdays, every week","description":"A paid-plan feature with a per-plan cap. Accepts the same post fields as a single post.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["content","socialAccountIds","daysOfWeek","timeOfDay","timezone"],"properties":{"content":{"type":"string"},"socialAccountIds":{"type":"array","items":{"type":"string"}},"daysOfWeek":{"type":"array","items":{"type":"integer","minimum":1,"maximum":7}},"timeOfDay":{"type":"string","example":"09:00"},"timezone":{"type":"string"},"startsOn":{"type":"string","format":"date"},"endsOn":{"type":["string","null"],"format":"date"},"mediaUrl":{"type":"string","format":"uri","description":"A publicly accessible image or video URL. Upload a file first with POST /media/upload to get one."},"mediaUrls":{"type":"array","items":{"type":"string","format":"uri"},"description":"Extra images after mediaUrl (multi-image post). GET /platforms/rules says how many each platform takes."},"coverImageUrl":{"type":"string","format":"uri","description":"A still cover for a video (Pinterest video pins need one)."},"mediaAltText":{"type":"string","description":"Accessibility description of the main image."},"firstComment":{"type":"string","description":"Posted right after publishing (Facebook and Instagram)."},"firstCommentDelayMinutes":{"type":"integer","minimum":0,"maximum":1440,"description":"Minutes to wait after the post goes live before posting firstComment (Facebook and Instagram). 0 or omitted posts it right away. Needs firstComment."},"tags":{"type":"array","items":{"type":"string"},"maxItems":5,"description":"Up to 5 short labels; filter analytics by them."},"selfReplyText":{"type":"string","description":"A comment added once the post reaches selfReplyAtLikes likes (Facebook and Instagram)."},"selfReplyAtLikes":{"type":"integer","minimum":1},"boardId":{"type":"string","description":"Pinterest: the board to pin to (GET /social-accounts/{id}/boards)."},"destinationLink":{"type":"string","format":"uri","description":"Pinterest: where a click on the pin goes."},"tiktokPrivacyLevel":{"type":"string","enum":["PUBLIC_TO_EVERYONE","MUTUAL_FOLLOW_FRIENDS","SELF_ONLY"],"description":"TikTok: REQUIRED for TikTok. GET /social-accounts/{id}/tiktok-creator-info lists what the account allows."},"tiktokDisableComment":{"type":"boolean","description":"TikTok: comments off (default true)."},"tiktokDisableDuet":{"type":"boolean","description":"TikTok: duets off (default true)."},"tiktokDisableStitch":{"type":"boolean","description":"TikTok: stitches off (default true)."},"tiktokBrandOrganic":{"type":"boolean"},"tiktokBrandContent":{"type":"boolean"},"options":{"$ref":"#/components/schemas/PostOptions"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: a plan limit, or this key may not do that.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/recurring-schedules/{id}":{"patch":{"operationId":"editRecurringSchedule","tags":["Scheduling"],"summary":"Edit, pause or resume a weekly schedule","parameters":[{"name":"id","in":"path","required":true,"description":"The schedule id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"status":{"type":"string","enum":["active","paused"]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteRecurringSchedule","tags":["Scheduling"],"summary":"Delete a weekly schedule","parameters":[{"name":"id","in":"path","required":true,"description":"The schedule id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/snippets":{"get":{"operationId":"listSnippets","tags":["Content"],"summary":"Saved text snippets and the signature","responses":{"200":{"description":"Snippets.","content":{"application/json":{"schema":{"type":"object","properties":{"maxSnippets":{"type":"integer"},"snippets":{"type":"array","items":{"$ref":"#/components/schemas/Snippet"}}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createSnippet","tags":["Content"],"summary":"Save a snippet","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","content"],"properties":{"name":{"type":"string","maxLength":60},"content":{"type":"string","maxLength":2000},"isSignature":{"type":"boolean"}}}}}},"responses":{"200":{"description":"The snippet.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Snippet"}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/snippets/{id}":{"patch":{"operationId":"editSnippet","tags":["Content"],"summary":"Edit a snippet","parameters":[{"name":"id","in":"path","required":true,"description":"The snippet id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"content":{"type":"string"},"isSignature":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteSnippet","tags":["Content"],"summary":"Delete a snippet","parameters":[{"name":"id","in":"path","required":true,"description":"The snippet id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/rss-feeds":{"get":{"operationId":"listRssFeeds","tags":["Content"],"summary":"RSS feeds whose new items become drafts","responses":{"200":{"description":"Feeds.","content":{"application/json":{"schema":{"type":"object","properties":{"maxFeeds":{"type":"integer"},"feeds":{"type":"array","items":{"$ref":"#/components/schemas/RssFeed"}}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createRssFeed","tags":["Content"],"summary":"Add a feed (new items become drafts, never posts)","description":"A paid-plan feature with a per-plan cap. The address is fetched and read first, so a non-feed is refused at once.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"},"label":{"type":"string"}}}}}},"responses":{"200":{"description":"The feed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RssFeed"}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: a plan limit, or this key may not do that.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/rss-feeds/{id}":{"patch":{"operationId":"setRssFeedEnabled","tags":["Content"],"summary":"Pause or resume a feed","parameters":[{"name":"id","in":"path","required":true,"description":"The feed id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteRssFeed","tags":["Content"],"summary":"Remove a feed","parameters":[{"name":"id","in":"path","required":true,"description":"The feed id","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/analytics/summary":{"get":{"operationId":"getAnalyticsSummary","tags":["Analytics"],"summary":"Post counts, verified-live rate, per-platform breakdown and engagement","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":90,"default":30}},{"name":"brand","in":"query","required":false,"schema":{"type":"string"}},{"name":"tag","in":"query","required":false,"description":"Only posts with this tag. availableTags in the answer lists the tags in use.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/mentions":{"get":{"operationId":"listMentions","tags":["Analytics"],"summary":"Recent comments on your posts, where the platform lets LazyRelay read them","description":"Without a filter this covers your 15 newest posted posts across every platform. With platforms, only those platforms are considered and the 15 newest posts are taken from them (the answer then also lists otherPlatforms: recent post counts of the platforms left out).","parameters":[{"name":"platforms","in":"query","required":false,"description":"Comma-separated platform ids, for example devto,hashnode. Letters, digits and underscores only, at most 30.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/mentions/reply":{"post":{"operationId":"replyToMention","tags":["Analytics"],"summary":"Reply to a comment from GET /mentions","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["postId","commentId","text"],"properties":{"postId":{"type":"string"},"commentId":{"type":"string"},"text":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/brands":{"get":{"operationId":"listBrands","tags":["Accounts"],"summary":"Brands (workspaces)","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/verify/{id}":{"get":{"operationId":"getPublicProof","tags":["Public"],"summary":"The public proof-of-publish page data (no key needed)","parameters":[{"name":"id","in":"path","required":true,"description":"A post result id from a proof link","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/review/{token}":{"get":{"operationId":"getPublicReview","tags":["Public"],"summary":"What a client sees through a review link (no key needed)","parameters":[{"name":"token","in":"path","required":true,"description":"The review link token","schema":{"type":"string"}}],"security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/review/{token}/posts/{postId}/approve":{"post":{"operationId":"publicReviewApprove","tags":["Public"],"summary":"A client approves a post","parameters":[{"name":"token","in":"path","required":true,"description":"The id","schema":{"type":"string"}},{"name":"postId","in":"path","required":true,"description":"The id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","maxLength":60}}}}}},"security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict: for example the post is no longer in a state that allows this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/review/{token}/posts/{postId}/changes":{"post":{"operationId":"publicReviewChanges","tags":["Public"],"summary":"A client asks for changes","parameters":[{"name":"token","in":"path","required":true,"description":"The id","schema":{"type":"string"}},{"name":"postId","in":"path","required":true,"description":"The id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","comment"],"properties":{"name":{"type":"string"},"comment":{"type":"string","maxLength":1000}}}}}},"security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict: for example the post is no longer in a state that allows this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/public/review/{token}/posts/{postId}/comments":{"post":{"operationId":"publicReviewComment","tags":["Public"],"summary":"A client comments on a post","parameters":[{"name":"token","in":"path","required":true,"description":"The id","schema":{"type":"string"}},{"name":"postId","in":"path","required":true,"description":"The id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","comment"],"properties":{"name":{"type":"string"},"comment":{"type":"string","maxLength":1000}}}}}},"security":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"The request was refused: the message says what to fix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found, or not yours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflict: for example the post is no longer in a state that allows this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"lzr_live_ API key","description":"An API key from the LazyRelay dashboard."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"A plain-language reason."}}},"PostOptions":{"type":"object","description":"Platform-specific settings. Send only the key that belongs to the account's platform; another platform's key is refused.","properties":{"tiktok":{"type":"object","properties":{"aiGenerated":{"type":"boolean"}}},"youtube":{"type":"object","properties":{"title":{"type":"string","maxLength":100},"privacy":{"type":"string","enum":["public","unlisted","private"]},"madeForKids":{"type":"boolean"},"tags":{"type":"array","items":{"type":"string"},"maxItems":15},"aiGenerated":{"type":"boolean"}}},"instagram":{"type":"object","properties":{"placement":{"type":"string","enum":["feed","reel","story"]},"trialReel":{"type":"boolean"},"trialGraduation":{"type":"string","enum":["manual","auto"]}}},"facebook":{"type":"object","properties":{"placement":{"type":"string","enum":["feed","story"]}}},"linkedin":{"type":"object","properties":{"documentUrl":{"type":"string","format":"uri","description":"https address of a PDF"},"documentTitle":{"type":"string","maxLength":100}}},"chain":{"type":"array","items":{"type":"string"},"maxItems":10,"description":"Threads, Bluesky, Mastodon and X: follow-up posts that reply in order (a thread)."}}},"PostInput":{"type":"object","required":["socialAccountId","content","scheduledFor"],"properties":{"socialAccountId":{"type":"string","description":"From GET /social-accounts."},"content":{"type":"string","description":"The post text."},"scheduledFor":{"type":"string","format":"date-time","description":"ISO 8601, in the future (the current time posts right away)."},"requiresApproval":{"type":"boolean","description":"Hold the post until it is approved (dashboard, PATCH /scheduled-posts/{id}/approve, or a client review link)."},"mediaUrl":{"type":"string","format":"uri","description":"A publicly accessible image or video URL. Upload a file first with POST /media/upload to get one."},"mediaUrls":{"type":"array","items":{"type":"string","format":"uri"},"description":"Extra images after mediaUrl (multi-image post). GET /platforms/rules says how many each platform takes."},"coverImageUrl":{"type":"string","format":"uri","description":"A still cover for a video (Pinterest video pins need one)."},"mediaAltText":{"type":"string","description":"Accessibility description of the main image."},"firstComment":{"type":"string","description":"Posted right after publishing (Facebook and Instagram)."},"firstCommentDelayMinutes":{"type":"integer","minimum":0,"maximum":1440,"description":"Minutes to wait after the post goes live before posting firstComment (Facebook and Instagram). 0 or omitted posts it right away. Needs firstComment."},"tags":{"type":"array","items":{"type":"string"},"maxItems":5,"description":"Up to 5 short labels; filter analytics by them."},"selfReplyText":{"type":"string","description":"A comment added once the post reaches selfReplyAtLikes likes (Facebook and Instagram)."},"selfReplyAtLikes":{"type":"integer","minimum":1},"boardId":{"type":"string","description":"Pinterest: the board to pin to (GET /social-accounts/{id}/boards)."},"destinationLink":{"type":"string","format":"uri","description":"Pinterest: where a click on the pin goes."},"tiktokPrivacyLevel":{"type":"string","enum":["PUBLIC_TO_EVERYONE","MUTUAL_FOLLOW_FRIENDS","SELF_ONLY"],"description":"TikTok: REQUIRED for TikTok. GET /social-accounts/{id}/tiktok-creator-info lists what the account allows."},"tiktokDisableComment":{"type":"boolean","description":"TikTok: comments off (default true)."},"tiktokDisableDuet":{"type":"boolean","description":"TikTok: duets off (default true)."},"tiktokDisableStitch":{"type":"boolean","description":"TikTok: stitches off (default true)."},"tiktokBrandOrganic":{"type":"boolean"},"tiktokBrandContent":{"type":"boolean"},"options":{"$ref":"#/components/schemas/PostOptions"}}},"DraftInput":{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"plannedDate":{"type":"string","format":"date"},"plannedAccountIds":{"type":"array","items":{"type":"string"}},"scheduledFor":{"type":"string","format":"date-time"},"mediaUrl":{"type":"string","format":"uri","description":"A publicly accessible image or video URL. Upload a file first with POST /media/upload to get one."},"mediaUrls":{"type":"array","items":{"type":"string","format":"uri"},"description":"Extra images after mediaUrl (multi-image post). GET /platforms/rules says how many each platform takes."},"coverImageUrl":{"type":"string","format":"uri","description":"A still cover for a video (Pinterest video pins need one)."},"mediaAltText":{"type":"string","description":"Accessibility description of the main image."},"firstComment":{"type":"string","description":"Posted right after publishing (Facebook and Instagram)."},"firstCommentDelayMinutes":{"type":"integer","minimum":0,"maximum":1440,"description":"Minutes to wait after the post goes live before posting firstComment (Facebook and Instagram). 0 or omitted posts it right away. Needs firstComment."},"tags":{"type":"array","items":{"type":"string"},"maxItems":5,"description":"Up to 5 short labels; filter analytics by them."},"selfReplyText":{"type":"string","description":"A comment added once the post reaches selfReplyAtLikes likes (Facebook and Instagram)."},"selfReplyAtLikes":{"type":"integer","minimum":1},"boardId":{"type":"string","description":"Pinterest: the board to pin to (GET /social-accounts/{id}/boards)."},"destinationLink":{"type":"string","format":"uri","description":"Pinterest: where a click on the pin goes."},"tiktokPrivacyLevel":{"type":"string","enum":["PUBLIC_TO_EVERYONE","MUTUAL_FOLLOW_FRIENDS","SELF_ONLY"],"description":"TikTok: REQUIRED for TikTok. GET /social-accounts/{id}/tiktok-creator-info lists what the account allows."},"tiktokDisableComment":{"type":"boolean","description":"TikTok: comments off (default true)."},"tiktokDisableDuet":{"type":"boolean","description":"TikTok: duets off (default true)."},"tiktokDisableStitch":{"type":"boolean","description":"TikTok: stitches off (default true)."},"tiktokBrandOrganic":{"type":"boolean"},"tiktokBrandContent":{"type":"boolean"},"options":{"$ref":"#/components/schemas/PostOptions"}}},"ScheduleDraftInput":{"type":"object","required":["socialAccountId","content","scheduledFor"],"properties":{"socialAccountId":{"type":"string"},"content":{"type":"string"},"scheduledFor":{"type":"string","format":"date-time"},"requiresApproval":{"type":"boolean"},"mediaUrl":{"type":"string","format":"uri","description":"A publicly accessible image or video URL. Upload a file first with POST /media/upload to get one."},"mediaUrls":{"type":"array","items":{"type":"string","format":"uri"},"description":"Extra images after mediaUrl (multi-image post). GET /platforms/rules says how many each platform takes."},"coverImageUrl":{"type":"string","format":"uri","description":"A still cover for a video (Pinterest video pins need one)."},"mediaAltText":{"type":"string","description":"Accessibility description of the main image."},"firstComment":{"type":"string","description":"Posted right after publishing (Facebook and Instagram)."},"firstCommentDelayMinutes":{"type":"integer","minimum":0,"maximum":1440,"description":"Minutes to wait after the post goes live before posting firstComment (Facebook and Instagram). 0 or omitted posts it right away. Needs firstComment."},"tags":{"type":"array","items":{"type":"string"},"maxItems":5,"description":"Up to 5 short labels; filter analytics by them."},"selfReplyText":{"type":"string","description":"A comment added once the post reaches selfReplyAtLikes likes (Facebook and Instagram)."},"selfReplyAtLikes":{"type":"integer","minimum":1},"boardId":{"type":"string","description":"Pinterest: the board to pin to (GET /social-accounts/{id}/boards)."},"destinationLink":{"type":"string","format":"uri","description":"Pinterest: where a click on the pin goes."},"tiktokPrivacyLevel":{"type":"string","enum":["PUBLIC_TO_EVERYONE","MUTUAL_FOLLOW_FRIENDS","SELF_ONLY"],"description":"TikTok: REQUIRED for TikTok. GET /social-accounts/{id}/tiktok-creator-info lists what the account allows."},"tiktokDisableComment":{"type":"boolean","description":"TikTok: comments off (default true)."},"tiktokDisableDuet":{"type":"boolean","description":"TikTok: duets off (default true)."},"tiktokDisableStitch":{"type":"boolean","description":"TikTok: stitches off (default true)."},"tiktokBrandOrganic":{"type":"boolean"},"tiktokBrandContent":{"type":"boolean"},"options":{"$ref":"#/components/schemas/PostOptions"}}},"PostEditInput":{"type":"object","description":"Only what you send changes.","properties":{"content":{"type":"string"},"plannedDate":{"type":"string","format":"date"},"mediaUrl":{"type":"string","format":"uri","description":"A publicly accessible image or video URL. Upload a file first with POST /media/upload to get one."},"mediaUrls":{"type":"array","items":{"type":"string","format":"uri"},"description":"Extra images after mediaUrl (multi-image post). GET /platforms/rules says how many each platform takes."},"coverImageUrl":{"type":"string","format":"uri","description":"A still cover for a video (Pinterest video pins need one)."},"mediaAltText":{"type":"string","description":"Accessibility description of the main image."},"firstComment":{"type":"string","description":"Posted right after publishing (Facebook and Instagram)."},"firstCommentDelayMinutes":{"type":"integer","minimum":0,"maximum":1440,"description":"Minutes to wait after the post goes live before posting firstComment (Facebook and Instagram). 0 or omitted posts it right away. Needs firstComment."},"tags":{"type":"array","items":{"type":"string"},"maxItems":5,"description":"Up to 5 short labels; filter analytics by them."},"selfReplyText":{"type":"string","description":"A comment added once the post reaches selfReplyAtLikes likes (Facebook and Instagram)."},"selfReplyAtLikes":{"type":"integer","minimum":1},"boardId":{"type":"string","description":"Pinterest: the board to pin to (GET /social-accounts/{id}/boards)."},"destinationLink":{"type":"string","format":"uri","description":"Pinterest: where a click on the pin goes."},"tiktokPrivacyLevel":{"type":"string","enum":["PUBLIC_TO_EVERYONE","MUTUAL_FOLLOW_FRIENDS","SELF_ONLY"],"description":"TikTok: REQUIRED for TikTok. GET /social-accounts/{id}/tiktok-creator-info lists what the account allows."},"tiktokDisableComment":{"type":"boolean","description":"TikTok: comments off (default true)."},"tiktokDisableDuet":{"type":"boolean","description":"TikTok: duets off (default true)."},"tiktokDisableStitch":{"type":"boolean","description":"TikTok: stitches off (default true)."},"tiktokBrandOrganic":{"type":"boolean"},"tiktokBrandContent":{"type":"boolean"},"options":{"$ref":"#/components/schemas/PostOptions"}}},"Post":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["draft","needs_approval","pending","posting","posted","failed"]},"social_account_id":{"type":["string","null"]},"content":{"type":"string"},"scheduled_for":{"type":["string","null"],"format":"date-time"},"media_url":{"type":["string","null"]},"media_urls":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}},"options":{"$ref":"#/components/schemas/PostOptions"},"changes_requested_at":{"type":["string","null"],"format":"date-time"},"post_results":{"type":"array","description":"Newest attempt first. verified_live is Proof-of-Publish: the platform was asked and confirmed the post is live.","items":{"type":"object","additionalProperties":true,"properties":{"verified_live":{"type":"boolean"},"platform_post_url":{"type":["string","null"]},"error_message":{"type":["string","null"]},"chain_posted":{"type":["integer","null"]}}}}}},"SocialAccount":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"platform":{"type":"string","description":"instagram, facebook, tiktok, youtube, pinterest, linkedin, threads, bluesky, mastodon, x, tumblr, telegram, discord, wordpress, devto, hashnode, lemmy, slack, nostr, whop"},"display_name":{"type":["string","null"]},"connected_at":{"type":"string","format":"date-time"},"disconnected_at":{"type":["string","null"],"format":"date-time"},"needs_reconnect_at":{"type":["string","null"],"format":"date-time","description":"Set when the platform login needs the owner to reconnect it."},"brand_label":{"type":["string","null"]}}},"ReviewLink":{"type":"object","properties":{"id":{"type":"string"},"token":{"type":"string"},"label":{"type":["string","null"]},"brandLabel":{"type":["string","null"]},"expiresAt":{"type":"string","format":"date-time"},"lastViewedAt":{"type":["string","null"]},"createdAt":{"type":"string"},"status":{"type":"string","enum":["active","expired","revoked"]}}},"ReviewComment":{"type":"object","properties":{"id":{"type":"string"},"authorKind":{"type":"string","enum":["reviewer","owner"]},"authorName":{"type":"string"},"kind":{"type":"string","enum":["comment","approved","changes_requested","updated"]},"body":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}},"PostingSlot":{"type":"object","properties":{"id":{"type":"string"},"daysOfWeek":{"type":"array","items":{"type":"integer","minimum":1,"maximum":7},"description":"ISO weekday, 1 Monday to 7 Sunday."},"timeOfDay":{"type":"string","example":"09:00"},"timezone":{"type":"string","example":"Africa/Johannesburg"}}},"Snippet":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"content":{"type":"string"},"isSignature":{"type":"boolean"}}},"RssFeed":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"label":{"type":["string","null"]},"enabled":{"type":"boolean"},"lastCheckedAt":{"type":["string","null"]},"lastError":{"type":["string","null"]}}},"MediaItem":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"url":{"type":"string"},"mime_type":{"type":"string"},"size_bytes":{"type":"integer"},"alt_text":{"type":["string","null"]}}},"PlatformRules":{"type":"object","properties":{"platforms":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"text limit, media rules, required fields, features, options, limits, lookups, notes and sources for one platform"}}}}}}}