{"servers":[{"url":"/api/creator"}],"info":{"title":"COPS Creator API","version":"1.0.0","description":"Creator API — a creator's own accounts, videos, earnings, and campaigns."},"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key for authentication. Keys are prefixed with `cops_`."}}},"openapi":"3.1.1","paths":{"/me/campaigns":{"get":{"operationId":"campaigns.list","summary":"List my campaigns","description":"Campaigns the caller participates in (id, name, org). Use a returned id with get_my_campaign_stats.","tags":["Creator"],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{},{"not":{}}]}}}}}}},"/me/earnings":{"get":{"operationId":"earnings","summary":"Get my earnings","description":"The caller's OWN payouts only: total paid + owed (cents) and a per-payout breakdown. Never another creator's earnings.","tags":["Creator"],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{},{"not":{}}]}}}}}}},"/me/tax-form":{"get":{"operationId":"taxForm.get","summary":"Get my tax form","description":"The caller's own tax-form status. Never returns tax IDs or form contents. Null before onboarding.","tags":["Creator"],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{},{"not":{}}]}}}}}}},"/me/beneficiary":{"get":{"operationId":"beneficiary.get","summary":"Get my payout destination","description":"The caller's own payout destination. Returns masked display fields only — never a full account number, IBAN, or routing value. Null before onboarding.","tags":["Creator"],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{},{"not":{}}]}}}}}}},"/me/manager/counts":{"get":{"operationId":"manager.counts","summary":"Get my manager tab counts","description":"Creator-scoped accounts/videos totals for the folder tabs + sidebar.","tags":["Creator"],"parameters":[{"name":"dateRange","in":"query","schema":{"type":"object","properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"}}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"platforms","in":"query","schema":{"type":"array","items":{"enum":["youtube","tiktok","instagram","snapchat","facebook","threads","twitter"],"type":"string"}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"q","in":"query","schema":{"type":"string","maxLength":200},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{},{"not":{}}]}}}}}}},"/me/manager/accounts/rows":{"get":{"operationId":"manager.accounts.rows","summary":"List my account rows","description":"Creator-scoped manager grid: cursor-paginated rows for the caller's own accounts. Carries no spend/cpm/cpe.","tags":["Creator"],"parameters":[{"name":"cursor","in":"query","schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque pagination cursor returned in `nextCursor` from the previous page. Pass `null` (or omit) for the first page. Cursors are tied to the active sort + filters and become invalid if those change."},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":0,"maximum":200,"default":100,"description":"Page size, 0–200. Use `0` to skip row materialization and return only `totalCount` (useful for tab badges / count-only requests). Default 100."},"allowEmptyValue":true,"allowReserved":true},{"name":"dateRange","in":"query","schema":{"type":"object","properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"}}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"platforms","in":"query","schema":{"type":"array","items":{"enum":["youtube","tiktok","instagram","snapchat","facebook","threads","twitter"],"type":"string"}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"campaignIds","in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"string","pattern":"^prj_.+[\\s\\S]*$"},{"const":"unassigned"}]}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"creatorIds","in":"query","schema":{"type":"array","items":{"type":"string","pattern":"^cre_.+[\\s\\S]*$"}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"accountIds","in":"query","schema":{"type":"array","items":{"type":"string","pattern":"^acct_.+[\\s\\S]*$"}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"sort","in":"query","schema":{"type":"string","maxLength":60,"description":"Single-column sort. Format: `<columnId>` for ascending, `-<columnId>` for descending (e.g. `-engagementRate`, `views`, `-publishedAt`). Allowed columnIds match the entity's sort keys; invalid keys are ignored."},"allowEmptyValue":true,"allowReserved":true},{"name":"q","in":"query","schema":{"type":"string","maxLength":200,"description":"Free-text search. Per-entity semantics: matches name/description for campaigns, name/email for creators, handle/name for accounts, title/handle for videos."},"allowEmptyValue":true,"allowReserved":true},{"name":"includeColumns","in":"query","schema":{"type":"array","maxItems":100,"items":{"type":"string","maxLength":80},"description":"Column ids the caller intends to render. When supplied, columns not listed may be skipped for performance and return as null, unless they're sorted or filtered. Unknown ids are silently ignored."},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"filter","in":"query","schema":{"type":"array","maxItems":40,"items":{"type":"object","properties":{"columnId":{"type":"string","maxLength":60},"variant":{"enum":["text","number","multi-select","boolean","date"],"type":"string"},"operator":{"enum":["is","isNot","isAnyOf","isNoneOf","contains","containsAny","containsAll","gt","gte","lt","lte","between","isTrue","isFalse","isEmpty","isNotEmpty"],"type":"string"},"value":{}},"required":["columnId","variant","operator"]},"description":"Filter constraints. Each entry is `{ columnId, variant, operator, value? }`. Supported operators per variant: number/date accept gt/gte/lt/lte/between + isEmpty/isNotEmpty; multi-select accepts isAnyOf/isNoneOf + isEmpty/isNotEmpty; boolean accepts isTrue/isFalse + isEmpty/isNotEmpty; text accepts is/isNot/contains + isEmpty/isNotEmpty. Invalid pairs are silently dropped."},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{},{"not":{}}]}}}}}}},"/me/manager/accounts/summary":{"get":{"operationId":"manager.accounts.summary","summary":"Get my accounts summary","description":"The caller's OWN accounts: total count + rolled-up footer summary. Mirrors get_my_videos_summary for the accounts grid. Carries no spend/cpm/cpe. Never another creator's accounts.","tags":["Creator"],"parameters":[{"name":"cursor","in":"query","schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque pagination cursor returned in `nextCursor` from the previous page. Pass `null` (or omit) for the first page. Cursors are tied to the active sort + filters and become invalid if those change."},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":0,"maximum":200,"default":100,"description":"Page size, 0–200. Use `0` to skip row materialization and return only `totalCount` (useful for tab badges / count-only requests). Default 100."},"allowEmptyValue":true,"allowReserved":true},{"name":"dateRange","in":"query","schema":{"type":"object","properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"}}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"platforms","in":"query","schema":{"type":"array","items":{"enum":["youtube","tiktok","instagram","snapchat","facebook","threads","twitter"],"type":"string"}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"campaignIds","in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"string","pattern":"^prj_.+[\\s\\S]*$"},{"const":"unassigned"}]}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"creatorIds","in":"query","schema":{"type":"array","items":{"type":"string","pattern":"^cre_.+[\\s\\S]*$"}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"accountIds","in":"query","schema":{"type":"array","items":{"type":"string","pattern":"^acct_.+[\\s\\S]*$"}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"sort","in":"query","schema":{"type":"string","maxLength":60,"description":"Single-column sort. Format: `<columnId>` for ascending, `-<columnId>` for descending (e.g. `-engagementRate`, `views`, `-publishedAt`). Allowed columnIds match the entity's sort keys; invalid keys are ignored."},"allowEmptyValue":true,"allowReserved":true},{"name":"q","in":"query","schema":{"type":"string","maxLength":200,"description":"Free-text search. Per-entity semantics: matches name/description for campaigns, name/email for creators, handle/name for accounts, title/handle for videos."},"allowEmptyValue":true,"allowReserved":true},{"name":"includeColumns","in":"query","schema":{"type":"array","maxItems":100,"items":{"type":"string","maxLength":80},"description":"Column ids the caller intends to render. When supplied, columns not listed may be skipped for performance and return as null, unless they're sorted or filtered. Unknown ids are silently ignored."},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"filter","in":"query","schema":{"type":"array","maxItems":40,"items":{"type":"object","properties":{"columnId":{"type":"string","maxLength":60},"variant":{"enum":["text","number","multi-select","boolean","date"],"type":"string"},"operator":{"enum":["is","isNot","isAnyOf","isNoneOf","contains","containsAny","containsAll","gt","gte","lt","lte","between","isTrue","isFalse","isEmpty","isNotEmpty"],"type":"string"},"value":{}},"required":["columnId","variant","operator"]},"description":"Filter constraints. Each entry is `{ columnId, variant, operator, value? }`. Supported operators per variant: number/date accept gt/gte/lt/lte/between + isEmpty/isNotEmpty; multi-select accepts isAnyOf/isNoneOf + isEmpty/isNotEmpty; boolean accepts isTrue/isFalse + isEmpty/isNotEmpty; text accepts is/isNot/contains + isEmpty/isNotEmpty. Invalid pairs are silently dropped."},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{},{"not":{}}]}}}}}}},"/me/manager/accounts/track":{"post":{"operationId":"manager.accounts.track","summary":"Track my accounts","description":"Track social accounts by profile URL and link them to the CALLER's OWN creator profile in their organization. Accepts one or more profile URLs. Optionally pass a campaignId from list_my_campaigns to route the accounts' new videos to that campaign. Accounts already owned by another creator in the org are left untouched (a creator can only ever link accounts to themselves). Requires a read_write credential.","tags":["Creator"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"accounts":{"type":"array","minItems":1,"maxItems":2500,"items":{"type":"object","properties":{"url":{"type":"string","minLength":1},"trackingLimit":{"type":"integer","minimum":1,"maximum":5000}},"required":["url","trackingLimit"]}},"campaignId":{"type":"string","pattern":"^prj_.+[\\s\\S]*$"}},"required":["accounts"]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{},{"not":{}}]}}}}}}},"/me/manager/videos/rows":{"get":{"operationId":"manager.videos.rows","summary":"List my video rows","description":"Creator-scoped manager grid: cursor-paginated rows for the caller's own videos. Carries no spend/cpm/cpe.","tags":["Creator"],"parameters":[{"name":"cursor","in":"query","schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque pagination cursor returned in `nextCursor` from the previous page. Pass `null` (or omit) for the first page. Cursors are tied to the active sort + filters and become invalid if those change."},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":0,"maximum":200,"default":100,"description":"Page size, 0–200. Use `0` to skip row materialization and return only `totalCount` (useful for tab badges / count-only requests). Default 100."},"allowEmptyValue":true,"allowReserved":true},{"name":"dateRange","in":"query","schema":{"type":"object","properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"}}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"platforms","in":"query","schema":{"type":"array","items":{"enum":["youtube","tiktok","instagram","snapchat","facebook","threads","twitter"],"type":"string"}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"campaignIds","in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"string","pattern":"^prj_.+[\\s\\S]*$"},{"const":"unassigned"}]}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"creatorIds","in":"query","schema":{"type":"array","items":{"type":"string","pattern":"^cre_.+[\\s\\S]*$"}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"accountIds","in":"query","schema":{"type":"array","items":{"type":"string","pattern":"^acct_.+[\\s\\S]*$"}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"showExcluded","in":"query","schema":{"type":"boolean"},"allowEmptyValue":true,"allowReserved":true},{"name":"sort","in":"query","schema":{"type":"string","maxLength":60,"description":"Single-column sort. Format: `<columnId>` for ascending, `-<columnId>` for descending (e.g. `-engagementRate`, `views`, `-publishedAt`). Allowed columnIds match the entity's sort keys; invalid keys are ignored."},"allowEmptyValue":true,"allowReserved":true},{"name":"q","in":"query","schema":{"type":"string","maxLength":200,"description":"Free-text search. Per-entity semantics: matches name/description for campaigns, name/email for creators, handle/name for accounts, title/handle for videos."},"allowEmptyValue":true,"allowReserved":true},{"name":"includeColumns","in":"query","schema":{"type":"array","maxItems":100,"items":{"type":"string","maxLength":80},"description":"Column ids the caller intends to render. When supplied, columns not listed may be skipped for performance and return as null, unless they're sorted or filtered. Unknown ids are silently ignored."},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"filter","in":"query","schema":{"type":"array","maxItems":40,"items":{"type":"object","properties":{"columnId":{"type":"string","maxLength":60},"variant":{"enum":["text","number","multi-select","boolean","date"],"type":"string"},"operator":{"enum":["is","isNot","isAnyOf","isNoneOf","contains","containsAny","containsAll","gt","gte","lt","lte","between","isTrue","isFalse","isEmpty","isNotEmpty"],"type":"string"},"value":{}},"required":["columnId","variant","operator"]},"description":"Filter constraints. Each entry is `{ columnId, variant, operator, value? }`. Supported operators per variant: number/date accept gt/gte/lt/lte/between + isEmpty/isNotEmpty; multi-select accepts isAnyOf/isNoneOf + isEmpty/isNotEmpty; boolean accepts isTrue/isFalse + isEmpty/isNotEmpty; text accepts is/isNot/contains + isEmpty/isNotEmpty. Invalid pairs are silently dropped."},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{},{"not":{}}]}}}}}}},"/me/manager/videos/summary":{"get":{"operationId":"manager.videos.summary","summary":"Get my videos summary","description":"Creator-scoped manager grid: total count + footer summary for the caller's own videos.","tags":["Creator"],"parameters":[{"name":"cursor","in":"query","schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque pagination cursor returned in `nextCursor` from the previous page. Pass `null` (or omit) for the first page. Cursors are tied to the active sort + filters and become invalid if those change."},"allowEmptyValue":true,"allowReserved":true},{"name":"limit","in":"query","schema":{"type":"integer","minimum":0,"maximum":200,"default":100,"description":"Page size, 0–200. Use `0` to skip row materialization and return only `totalCount` (useful for tab badges / count-only requests). Default 100."},"allowEmptyValue":true,"allowReserved":true},{"name":"dateRange","in":"query","schema":{"type":"object","properties":{"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"}}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"platforms","in":"query","schema":{"type":"array","items":{"enum":["youtube","tiktok","instagram","snapchat","facebook","threads","twitter"],"type":"string"}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"campaignIds","in":"query","schema":{"type":"array","items":{"anyOf":[{"type":"string","pattern":"^prj_.+[\\s\\S]*$"},{"const":"unassigned"}]}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"creatorIds","in":"query","schema":{"type":"array","items":{"type":"string","pattern":"^cre_.+[\\s\\S]*$"}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"accountIds","in":"query","schema":{"type":"array","items":{"type":"string","pattern":"^acct_.+[\\s\\S]*$"}},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"showExcluded","in":"query","schema":{"type":"boolean"},"allowEmptyValue":true,"allowReserved":true},{"name":"sort","in":"query","schema":{"type":"string","maxLength":60,"description":"Single-column sort. Format: `<columnId>` for ascending, `-<columnId>` for descending (e.g. `-engagementRate`, `views`, `-publishedAt`). Allowed columnIds match the entity's sort keys; invalid keys are ignored."},"allowEmptyValue":true,"allowReserved":true},{"name":"q","in":"query","schema":{"type":"string","maxLength":200,"description":"Free-text search. Per-entity semantics: matches name/description for campaigns, name/email for creators, handle/name for accounts, title/handle for videos."},"allowEmptyValue":true,"allowReserved":true},{"name":"includeColumns","in":"query","schema":{"type":"array","maxItems":100,"items":{"type":"string","maxLength":80},"description":"Column ids the caller intends to render. When supplied, columns not listed may be skipped for performance and return as null, unless they're sorted or filtered. Unknown ids are silently ignored."},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true},{"name":"filter","in":"query","schema":{"type":"array","maxItems":40,"items":{"type":"object","properties":{"columnId":{"type":"string","maxLength":60},"variant":{"enum":["text","number","multi-select","boolean","date"],"type":"string"},"operator":{"enum":["is","isNot","isAnyOf","isNoneOf","contains","containsAny","containsAll","gt","gte","lt","lte","between","isTrue","isFalse","isEmpty","isNotEmpty"],"type":"string"},"value":{}},"required":["columnId","variant","operator"]},"description":"Filter constraints. Each entry is `{ columnId, variant, operator, value? }`. Supported operators per variant: number/date accept gt/gte/lt/lte/between + isEmpty/isNotEmpty; multi-select accepts isAnyOf/isNoneOf + isEmpty/isNotEmpty; boolean accepts isTrue/isFalse + isEmpty/isNotEmpty; text accepts is/isNot/contains + isEmpty/isNotEmpty. Invalid pairs are silently dropped."},"style":"deepObject","explode":true,"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{},{"not":{}}]}}}}}}},"/me/program/stats":{"get":{"operationId":"program.stats","summary":"Program campaign header stats","description":"Campaign-wide Views/Videos/Creators/Accounts for the header — no $ (avgCPM/totalEarnings stripped).","tags":["Creator"],"parameters":[{"name":"campaignId","in":"query","required":true,"schema":{"type":"string","pattern":"^prj_.+[\\s\\S]*$"},"allowEmptyValue":true,"allowReserved":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{},{"not":{}}]}}}}}}},"/me/audience-reviews/pending":{"get":{"operationId":"crosspostReviews.listRequired","summary":"List my crosspost groups awaiting an analytics recording","description":"The caller's crosspost groups that owe an analytics screen recording: a milestone bonus is being paid and the bonus-earning copy crossed the structure's view minimum, but no recording has been submitted yet. Each item points at the highest-viewed copy to record.","tags":["Creator"],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"anyOf":[{},{"not":{}}]}}}}}}}}}