{"openapi":"3.1.1","info":{"title":"ZeroCut API","version":"1.0.0","description":"ZeroCut REST API. Authenticate with x-api-key using a creator-owned key from dashboard settings. Requires ZeroCut Premium. Keys are account-wide; OAuth delegation and per-key scopes are not supported. See https://zerocut.gg/docs/api for onboarding, test requests, rate limits, and the versioning and deprecation policy."},"servers":[{"url":"/api/v1","description":"Production"},{"url":"/api/test/v1","description":"Test"}],"security":[{"API Key":[]}],"tags":[{"name":"Donation","description":"Endpoints for creating, querying, and analyzing donations\n\nEndpoints:\n- Create Donation (POST /donation/create)\n- Query Donation (GET /donation/getById)\n- List Donations (GET /donation/list)\n- Donation Stats (GET /donation/stats)\n- Daily Donations (GET /donation/daily)\n- Hourly Donations (GET /donation/hourly)\n- Top Donors (GET /donation/top-donors)\n- Top Countries (GET /donation/top-countries)\n- Donation Breakdown (GET /donation/breakdown)"},{"name":"Donation Perks","description":"Read-only access to the creator's current donation perk catalog"},{"name":"Perk","description":"Endpoints:\n- List Perks (GET /perk/list)\n- Get Perk (GET /perk/getById)"},{"name":"Follower","description":"Endpoints for managing and analyzing follower counts\n\nEndpoints:\n- Add Follower (POST /follower/create)\n- List Followers (GET /follower/list)\n- Current Follower Count (GET /follower/current)\n- Follower Stats (GET /follower/stats)\n- Followers by Date Range (GET /follower/byDateRange)\n- Update Follower Count (POST /follower/update)"},{"name":"Live Session","description":"Endpoints for managing live streaming sessions and events\n\nEndpoints:\n- Add Live Session (POST /live-session/create)\n- List Live Sessions (GET /live-session/list)\n- Get Live Session (GET /live-session/getById)\n- Get Session Events (GET /live-session/events)\n- Add Session Event (POST /live-session/addEvent)\n- Update Live Session (POST /live-session/update)\n- Delete Live Session (POST /live-session/delete)"},{"name":"Analytics","description":"Endpoints for retrieving analytics data and time series\n\nEndpoints:\n- Analytics Overview (GET /analytics/overview)\n- Daily Analytics (GET /analytics/daily)\n- Hourly Analytics (GET /analytics/hourly)\n- Weekly Analytics (GET /analytics/weekly)\n- Top Activities (GET /analytics/activities)\n- Oldest Data (GET /analytics/oldest)"},{"name":"Goal","description":"Endpoints for viewing donation goals and progress\n\nEndpoints:\n- List Goals (GET /goal/list)\n- Get Goal (GET /goal/getById)\n- Active Goals (GET /goal/active)"},{"name":"Profile","description":"Endpoints for viewing profile information\n\nEndpoints:\n- Get Profile (GET /profile/get)"},{"name":"Events","description":"Token minting for the public event stream. The stream itself is a text/event-stream endpoint and is documented by hand.\n\nEndpoints:\n- Create Event Stream Token (POST /events/stream-token)"},{"name":"Visitors","description":"Page-visitor analytics. Premium feature — requires a handle.\n\nEndpoints:\n- Visitor Aggregate (GET /visitors/aggregate)\n- Visitor Timeseries (GET /visitors/timeseries)\n- Visitor Breakdown (GET /visitors/breakdown)\n- Visitor Realtime (GET /visitors/realtime)\n- Visitor Goal Conversions (GET /visitors/goals)\n- Visitor Donation Methods (GET /visitors/donation-methods)"}],"paths":{"/donation/create":{"post":{"operationId":"post_donation_create","summary":"Create Donation","description":"Create a donation for a creator","tags":["Donation"],"security":[{"API Key":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount":{"type":"number","minimum":1,"maximum":10000,"multipleOf":0.01,"description":"Donation amount in dollars with at most 2 decimal places (e.g. 5.00 for $5.00, max 10000.00)"},"currency":{"type":"string","enum":["aed","afn","all","amd","ang","aoa","ars","aud","awg","azn","bam","bbd","bdt","bgn","bif","bmd","bnd","bob","brl","bsd","bwp","byn","bzd","cad","cdf","chf","clp","cny","cop","crc","cve","czk","djf","dkk","dop","dzd","egp","etb","eur","fjd","fkp","gbp","gel","gip","gmd","gnf","gtq","gyd","hkd","hnl","hrk","htg","huf","idr","ils","inr","isk","jmd","jpy","kes","kgs","khr","kmf","krw","kyd","kzt","lak","lbp","lkr","lrd","lsl","mad","mdl","mga","mkd","mmk","mnt","mop","mro","mur","mvr","mwk","mxn","myr","mzn","nad","ngn","nio","nok","npr","nzd","pab","pen","pgk","php","pkr","pln","pyg","qar","ron","rsd","rub","rwf","sar","sbd","scr","sek","sgd","shp","sle","sll","sos","srd","std","stn","szl","thb","tjs","top","try","ttd","twd","tzs","uah","ugx","usd","uyu","uzs","vnd","vuv","wst","xaf","xcd","xof","xpf","yer","zar","zmw","zwl"],"description":"Currency code (ISO 4217). Must be a valid Stripe-supported currency."},"donorName":{"description":"Donor name","type":"string","maxLength":200},"donorEmail":{"description":"Donor email (optional, may be set by payment provider)","anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"string","const":""},{"not":{}}]},"message":{"description":"Donation message","type":"string","maxLength":500}},"required":["amount","currency"]}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"id":"test-donation-id","amount":1000,"currency":"usd","donorName":"Test Donor","donorEmail":"test@example.com","message":"Test donation","createdAt":"2026-09-20T17:37:25.651Z"},"schema":{"type":"object","properties":{"id":{"type":"string","description":"Donation ID"},"amount":{"type":"number","description":"Donation amount in cents"},"currency":{"type":"string","enum":["aed","afn","all","amd","ang","aoa","ars","aud","awg","azn","bam","bbd","bdt","bgn","bif","bmd","bnd","bob","brl","bsd","bwp","byn","bzd","cad","cdf","chf","clp","cny","cop","crc","cve","czk","djf","dkk","dop","dzd","egp","etb","eur","fjd","fkp","gbp","gel","gip","gmd","gnf","gtq","gyd","hkd","hnl","hrk","htg","huf","idr","ils","inr","isk","jmd","jpy","kes","kgs","khr","kmf","krw","kyd","kzt","lak","lbp","lkr","lrd","lsl","mad","mdl","mga","mkd","mmk","mnt","mop","mro","mur","mvr","mwk","mxn","myr","mzn","nad","ngn","nio","nok","npr","nzd","pab","pen","pgk","php","pkr","pln","pyg","qar","ron","rsd","rub","rwf","sar","sbd","scr","sek","sgd","shp","sle","sll","sos","srd","std","stn","szl","thb","tjs","top","try","ttd","twd","tzs","uah","ugx","usd","uyu","uzs","vnd","vuv","wst","xaf","xcd","xof","xpf","yer","zar","zmw","zwl"],"description":"Currency code (ISO 4217). Must be a valid Stripe-supported currency."},"donorName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Donor name"},"donorEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Donor email"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Donation message"},"createdAt":{"type":"string","description":"Donation creation timestamp"}},"required":["id","amount","currency","donorName","donorEmail","message","createdAt"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Create Donation","x-displayName":"Create Donation","description":"Create a donation for a creator"},"/donation/getById":{"get":{"operationId":"get_donation_getById","summary":"Query Donation","description":"Get a donation by ID","tags":["Donation"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Donation ID"},"required":true,"description":"Donation ID"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"id":"00000000-0000-0000-0000-000000000000","userId":"test-user-id","amount":1000,"currency":"usd","stripePaymentIntentId":"pi_test_123","donorEmail":"donor@example.com","donorName":"John Doe","message":"Great content!","perk":null,"perks":[],"paymentMethodLast4":"4242","country":"US","discordUserId":null,"discordRoleAssigned":false,"createdAt":"2026-09-20T17:37:25.652Z"},"schema":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Donation ID"},"userId":{"type":"string","description":"User ID"},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Donation amount in cents"},"currency":{"type":"string","enum":["aed","afn","all","amd","ang","aoa","ars","aud","awg","azn","bam","bbd","bdt","bgn","bif","bmd","bnd","bob","brl","bsd","bwp","byn","bzd","cad","cdf","chf","clp","cny","cop","crc","cve","czk","djf","dkk","dop","dzd","egp","etb","eur","fjd","fkp","gbp","gel","gip","gmd","gnf","gtq","gyd","hkd","hnl","hrk","htg","huf","idr","ils","inr","isk","jmd","jpy","kes","kgs","khr","kmf","krw","kyd","kzt","lak","lbp","lkr","lrd","lsl","mad","mdl","mga","mkd","mmk","mnt","mop","mro","mur","mvr","mwk","mxn","myr","mzn","nad","ngn","nio","nok","npr","nzd","pab","pen","pgk","php","pkr","pln","pyg","qar","ron","rsd","rub","rwf","sar","sbd","scr","sek","sgd","shp","sle","sll","sos","srd","std","stn","szl","thb","tjs","top","try","ttd","twd","tzs","uah","ugx","usd","uyu","uzs","vnd","vuv","wst","xaf","xcd","xof","xpf","yer","zar","zmw","zwl"],"description":"Currency code (ISO 4217). Must be a valid Stripe-supported currency."},"stripePaymentIntentId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stripe payment intent ID"},"donorEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Donor email"},"donorName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Donor name"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Donation message"},"perk":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Purchased perk ID"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Frozen perk title"}},"required":["id","title"],"additionalProperties":false},{"type":"null"}],"description":"Legacy single-perk reference"},"perks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Purchased perk ID"},"title":{"type":"string","description":"Frozen perk title"},"quantity":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Purchased quantity"},"unitAmount":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Frozen unit price in minor currency units"},"lineTotal":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Frozen line total in minor currency units"},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"Uppercase ISO 4217 currency code"}},"required":["id","title","quantity","unitAmount","lineTotal","currency"],"additionalProperties":false},"description":"Frozen purchased perk lines"},"paymentMethodLast4":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Last 4 digits of payment method"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Country code"},"discordUserId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Discord user ID if connected"},"discordRoleAssigned":{"type":"boolean","description":"Whether Discord role was assigned"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the donation was created"}},"required":["id","userId","amount","currency","stripePaymentIntentId","donorEmail","donorName","message","perk","perks","paymentMethodLast4","country","discordUserId","discordRoleAssigned","createdAt"],"additionalProperties":false},{"type":"null"}]}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Query Donation","x-displayName":"Query Donation","description":"Get a donation by ID"},"/donation/list":{"get":{"operationId":"get_donation_list","summary":"List Donations","description":"Get a paginated list of donations","tags":["Donation"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"limit","schema":{"description":"Max results to return (1-100, default 50)","default":50,"type":"integer","minimum":1,"maximum":100},"description":"Max results to return (1-100, default 50)"},{"in":"query","name":"cursor","schema":{"description":"Cursor for pagination (pass nextCursor from previous response)","type":"string","maxLength":256},"description":"Cursor for pagination (pass nextCursor from previous response)"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"donations":[{"id":"00000000-0000-0000-0000-000000000000","amount":1000,"currency":"usd","donorName":"John Doe","donorEmail":"john@example.com","message":"Great content!","perk":null,"perks":[],"paymentMethodLast4":"4242","country":"US","discordUserId":null,"discordRoleAssigned":false,"createdAt":"2026-09-20T17:37:25.653Z"}],"nextCursor":null},"schema":{"type":"object","properties":{"donations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Donation ID"},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Amount in cents"},"currency":{"type":"string","enum":["aed","afn","all","amd","ang","aoa","ars","aud","awg","azn","bam","bbd","bdt","bgn","bif","bmd","bnd","bob","brl","bsd","bwp","byn","bzd","cad","cdf","chf","clp","cny","cop","crc","cve","czk","djf","dkk","dop","dzd","egp","etb","eur","fjd","fkp","gbp","gel","gip","gmd","gnf","gtq","gyd","hkd","hnl","hrk","htg","huf","idr","ils","inr","isk","jmd","jpy","kes","kgs","khr","kmf","krw","kyd","kzt","lak","lbp","lkr","lrd","lsl","mad","mdl","mga","mkd","mmk","mnt","mop","mro","mur","mvr","mwk","mxn","myr","mzn","nad","ngn","nio","nok","npr","nzd","pab","pen","pgk","php","pkr","pln","pyg","qar","ron","rsd","rub","rwf","sar","sbd","scr","sek","sgd","shp","sle","sll","sos","srd","std","stn","szl","thb","tjs","top","try","ttd","twd","tzs","uah","ugx","usd","uyu","uzs","vnd","vuv","wst","xaf","xcd","xof","xpf","yer","zar","zmw","zwl"],"description":"Currency code (ISO 4217)"},"donorName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Donor name"},"donorEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Donor email"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Donation message"},"perk":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Purchased perk ID"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Frozen perk title"}},"required":["id","title"],"additionalProperties":false},{"type":"null"}],"description":"Legacy single-perk reference, or null for carts and donations without a perk"},"perks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Purchased perk ID"},"title":{"type":"string","description":"Frozen perk title"},"quantity":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Purchased quantity"},"unitAmount":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Frozen unit price in minor currency units"},"lineTotal":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Frozen line total in minor currency units"},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"Uppercase ISO 4217 currency code"}},"required":["id","title","quantity","unitAmount","lineTotal","currency"],"additionalProperties":false},"description":"Frozen purchased perk lines; empty for donations without a cart snapshot"},"paymentMethodLast4":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Last 4 digits of payment method"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Country code"},"discordUserId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Discord user ID if connected"},"discordRoleAssigned":{"type":"boolean","description":"Whether Discord role was assigned"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the donation was created"}},"required":["id","amount","currency","donorName","donorEmail","message","perk","perks","paymentMethodLast4","country","discordUserId","discordRoleAssigned","createdAt"],"additionalProperties":false}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["donations","nextCursor"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"List Donations","x-displayName":"List Donations","description":"Get a paginated list of donations"},"/donation/stats":{"get":{"operationId":"get_donation_stats","summary":"Donation Stats","description":"Get donation statistics grouped by currency","tags":["Donation"],"security":[{"API Key":[]}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"stats":[{"currency":"usd","total":50000,"count":25,"thisMonthTotal":10000,"thisMonthCount":5,"average":2000}]},"schema":{"type":"object","properties":{"stats":{"type":"array","items":{"type":"object","properties":{"currency":{"type":"string","description":"Currency code"},"total":{"type":"number","description":"Total amount in cents"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of donations"},"thisMonthTotal":{"type":"number","description":"Total amount this month in cents"},"thisMonthCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of donations this month"},"average":{"type":"number","description":"Average donation amount in cents"}},"required":["currency","total","count","thisMonthTotal","thisMonthCount","average"],"additionalProperties":false}}},"required":["stats"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Donation Stats","x-displayName":"Donation Stats","description":"Get donation statistics grouped by currency"},"/donation/daily":{"get":{"operationId":"get_donation_daily","summary":"Daily Donations","description":"Get daily donation aggregation","tags":["Donation"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"days","schema":{"description":"Number of days to look back (1-365, default 30)","default":30,"type":"integer","minimum":1,"maximum":365},"description":"Number of days to look back (1-365, default 30)"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"daily":[{"date":"2024-01-15","currency":"usd","amount":5000,"count":3,"formattedDate":"Jan 15"}]},"schema":{"type":"object","properties":{"daily":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date (YYYY-MM-DD)"},"currency":{"type":"string","description":"Currency code"},"amount":{"type":"number","description":"Total amount in cents"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of donations"},"formattedDate":{"type":"string","description":"Human-readable date (e.g. Mar 15)"}},"required":["date","currency","amount","count","formattedDate"],"additionalProperties":false}}},"required":["daily"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Daily Donations","x-displayName":"Daily Donations","description":"Get daily donation aggregation"},"/donation/hourly":{"get":{"operationId":"get_donation_hourly","summary":"Hourly Donations","description":"Get hourly donation aggregation","tags":["Donation"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"days","schema":{"description":"Number of days to look back (1-90, default 7)","default":7,"type":"integer","minimum":1,"maximum":90},"description":"Number of days to look back (1-90, default 7)"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"hourly":[{"hour":14,"hourLabel":"14:00","amount":50,"count":3}]},"schema":{"type":"object","properties":{"hourly":{"type":"array","items":{"type":"object","properties":{"hour":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Hour of day (0-23)"},"hourLabel":{"type":"string","description":"Hour label (e.g. 14:00)"},"amount":{"type":"number","description":"Total amount in dollars"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of donations"}},"required":["hour","hourLabel","amount","count"],"additionalProperties":false}}},"required":["hourly"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Hourly Donations","x-displayName":"Hourly Donations","description":"Get hourly donation aggregation"},"/donation/top-donors":{"get":{"operationId":"get_donation_top-donors","summary":"Top Donors","description":"Get top donors leaderboard","tags":["Donation"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"limit","schema":{"description":"Number of top donors to return (1-100, default 10)","default":10,"type":"integer","minimum":1,"maximum":100},"description":"Number of top donors to return (1-100, default 10)"},{"in":"query","name":"startDate","schema":{"description":"Start date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"Start date (ISO 8601). Provide startDate and endDate together."},{"in":"query","name":"endDate","schema":{"description":"End date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"End date (ISO 8601). Provide startDate and endDate together."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"donors":[{"name":"John Doe","total":10000,"count":5,"currency":"usd","last4":"4242","lastDonation":"2026-09-20T17:37:25.656Z"}]},"schema":{"type":"object","properties":{"donors":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Donor name"},"total":{"type":"number","description":"Total amount in cents"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of donations"},"currency":{"type":"string","description":"Currency code"},"last4":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Last 4 digits of payment method"},"lastDonation":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the last donation was made"}},"required":["name","total","count","currency","last4","lastDonation"],"additionalProperties":false}}},"required":["donors"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Top Donors","x-displayName":"Top Donors","description":"Get top donors leaderboard"},"/donation/top-countries":{"get":{"operationId":"get_donation_top-countries","summary":"Top Countries","description":"Get countries ranked by donation volume","tags":["Donation"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"limit","schema":{"description":"Number of top countries to return (1-100, default 10)","default":10,"type":"integer","minimum":1,"maximum":100},"description":"Number of top countries to return (1-100, default 10)"},{"in":"query","name":"startDate","schema":{"description":"Start date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"Start date (ISO 8601). Provide startDate and endDate together."},{"in":"query","name":"endDate","schema":{"description":"End date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"End date (ISO 8601). Provide startDate and endDate together."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"countries":[{"country":"US","total":25000,"count":15,"currency":"usd"}]},"schema":{"type":"object","properties":{"countries":{"type":"array","items":{"type":"object","properties":{"country":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)"},"total":{"type":"number","description":"Total amount in cents"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of donations"},"currency":{"type":"string","description":"Currency code"}},"required":["country","total","count","currency"],"additionalProperties":false}}},"required":["countries"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Top Countries","x-displayName":"Top Countries","description":"Get countries ranked by donation volume"},"/donation/breakdown":{"get":{"operationId":"get_donation_breakdown","summary":"Donation Breakdown","description":"Get donation breakdown by category (named vs anonymous)","tags":["Donation"],"security":[{"API Key":[]}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"breakdown":[{"name":"Named Donors","value":40000,"count":20},{"name":"Anonymous","value":10000,"count":5}]},"schema":{"type":"object","properties":{"breakdown":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Category name (e.g. Named Donors, Anonymous)"},"value":{"type":"number","description":"Total amount in cents"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of donations"}},"required":["name","value","count"],"additionalProperties":false}}},"required":["breakdown"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Donation Breakdown","x-displayName":"Donation Breakdown","description":"Get donation breakdown by category (named vs anonymous)"},"/perk/list":{"get":{"operationId":"get_perk_list","summary":"List Perks","description":"List the creator's current donation perk catalog","tags":["Perk"],"security":[{"API Key":[]}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"label":"Choose a perk","combinationMode":"SINGLE","compatiblePairs":[],"perks":[{"id":"00000000-0000-4000-8000-000000000001","title":"Shoutout","amount":1500,"currency":"USD","isActive":true,"archivedAt":null,"sortOrder":0,"maxQuantity":1,"createdAt":"2026-09-20T17:37:25.657Z","updatedAt":"2026-09-20T17:37:25.657Z"}]},"schema":{"type":"object","properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Public heading above the perk catalog"},"combinationMode":{"type":"string","enum":["SINGLE","ANY","CUSTOM"],"description":"How donors may combine perks in one donation"},"compatiblePairs":{"type":"array","items":{"type":"object","properties":{"leftPerkId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"First compatible perk ID"},"rightPerkId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Second compatible perk ID"}},"required":["leftPerkId","rightPerkId"],"additionalProperties":false}},"perks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Perk ID; use this value in event-stream perkIds filters"},"title":{"type":"string","description":"Current perk title"},"amount":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Current unit price in minor units"},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"Uppercase ISO 4217 currency code"},"isActive":{"type":"boolean","description":"Whether donors can currently purchase this perk"},"archivedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"When the perk was archived"},"sortOrder":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Catalog display order"},"maxQuantity":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Maximum quantity allowed in one donation"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the perk was created"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the perk was last changed"}},"required":["id","title","amount","currency","isActive","archivedAt","sortOrder","maxQuantity","createdAt","updatedAt"],"additionalProperties":false}}},"required":["label","combinationMode","compatiblePairs","perks"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"List Perks","x-displayName":"List Perks","description":"List the creator's current donation perk catalog"},"/perk/getById":{"get":{"operationId":"get_perk_getById","summary":"Get Perk","description":"Get one current donation perk by ID","tags":["Perk"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Perk ID"},"required":true,"description":"Perk ID"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"id":"00000000-0000-4000-8000-000000000001","title":"Shoutout","amount":1500,"currency":"USD","isActive":true,"archivedAt":null,"sortOrder":0,"maxQuantity":1,"createdAt":"2026-09-20T17:37:25.658Z","updatedAt":"2026-09-20T17:37:25.658Z"},"schema":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Perk ID; use this value in event-stream perkIds filters"},"title":{"type":"string","description":"Current perk title"},"amount":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Current unit price in minor units"},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"Uppercase ISO 4217 currency code"},"isActive":{"type":"boolean","description":"Whether donors can currently purchase this perk"},"archivedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"When the perk was archived"},"sortOrder":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Catalog display order"},"maxQuantity":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Maximum quantity allowed in one donation"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the perk was created"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the perk was last changed"}},"required":["id","title","amount","currency","isActive","archivedAt","sortOrder","maxQuantity","createdAt","updatedAt"],"additionalProperties":false},{"type":"null"}]}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Get Perk","x-displayName":"Get Perk","description":"Get one current donation perk by ID"},"/follower/create":{"post":{"operationId":"post_follower_create","summary":"Add Follower","description":"Add a follower count record","tags":["Follower"],"security":[{"API Key":[]}],"requestBody":{"required":true,"content":{"application/json":{"example":{"followerCount":1000,"platform":"twitch","accountId":null},"schema":{"allOf":[{"type":"object","properties":{"followerCount":{"type":"integer","minimum":0,"maximum":1000000000,"description":"Current follower count"}},"required":["followerCount"]},{"anyOf":[{"type":"object","properties":{"platform":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$","description":"Platform that owns this follower count","example":"twitch"},"source":{"default":"api","description":"Legacy producer label; not returned in follower DTOs","example":"api","type":"string","maxLength":80,"pattern":"^[a-z0-9][a-z0-9_-]{0,79}$"},"accountId":{"description":"Provider-native account ID. Omit or pass null only for a platform-wide manual value.","anyOf":[{"type":"string"},{"type":"null"}]}},"required":["platform"]},{"type":"object","properties":{"platform":{"not":{}},"source":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$","description":"Compatibility form: source names the platform","example":"twitch"},"accountId":{"description":"Provider-native account ID. Omit or pass null only for a platform-wide manual value.","anyOf":[{"type":"string"},{"type":"null"}]}},"required":["source"]}],"description":"Name platform explicitly or use the legacy source-as-platform form.","example":{"platform":"twitch","source":"api","accountId":null}}],"example":{"followerCount":1000,"platform":"twitch","accountId":null}}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"id":"00000000-0000-0000-0000-000000000000","userId":"test-user-id","followerCount":1000,"platform":"twitch","accountId":null,"origin":"manual","recordedAt":"2026-09-20T17:37:25.658Z","createdAt":"2026-09-20T17:37:25.658Z"},"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Follower record ID"},"userId":{"type":"string","description":"User ID"},"followerCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Follower count"},"platform":{"type":"string","description":"Platform"},"accountId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider-native account ID"},"origin":{"type":"string","enum":["manual","provider","legacy"],"description":"How the observation entered ZeroCut"},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the follower count was recorded"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the record was created"}},"required":["id","userId","followerCount","platform","accountId","origin","recordedAt","createdAt"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Add Follower","x-displayName":"Add Follower","description":"Add a follower count record"},"/follower/list":{"get":{"operationId":"get_follower_list","summary":"List Followers","description":"Get a paginated list of follower count records","tags":["Follower"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"limit","schema":{"description":"Max results to return (1-100, default 50)","default":50,"type":"integer","minimum":1,"maximum":100},"description":"Max results to return (1-100, default 50)"},{"in":"query","name":"cursor","schema":{"description":"Cursor for pagination (pass nextCursor from previous response)","type":"string","maxLength":256},"description":"Cursor for pagination (pass nextCursor from previous response)"},{"in":"query","name":"platform","schema":{"description":"Filter by platform (e.g. twitch, youtube)","type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$"},"description":"Filter by platform (e.g. twitch, youtube)"},{"in":"query","name":"accountId","schema":{"description":"Filter by a provider-native account ID (requires platform)","type":"string"},"description":"Filter by a provider-native account ID (requires platform)"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"followers":[{"id":"00000000-0000-0000-0000-000000000000","followerCount":1000,"platform":"twitch","accountId":null,"origin":"manual","recordedAt":"2026-09-20T17:37:25.659Z","createdAt":"2026-09-20T17:37:25.659Z"}],"nextCursor":null},"schema":{"type":"object","properties":{"followers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Follower record ID"},"followerCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Follower count"},"platform":{"type":"string","description":"Platform"},"accountId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider-native account ID"},"origin":{"type":"string","enum":["manual","provider","legacy"],"description":"How the observation entered ZeroCut"},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the follower count was recorded"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Record created at"}},"required":["id","followerCount","platform","accountId","origin","recordedAt","createdAt"],"additionalProperties":false}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["followers","nextCursor"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"List Followers","x-displayName":"List Followers","description":"Get a paginated list of follower count records"},"/follower/current":{"get":{"operationId":"get_follower_current","summary":"Current Follower Count","description":"Get the current (latest) follower count","tags":["Follower"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"platform","schema":{"description":"Filter by platform (e.g. twitch, youtube)","type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$"},"description":"Filter by platform (e.g. twitch, youtube)"},{"in":"query","name":"accountId","schema":{"description":"Filter by a provider-native account ID (requires platform)","type":"string"},"description":"Filter by a provider-native account ID (requires platform)"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"follower":{"id":"00000000-0000-0000-0000-000000000000","followerCount":1500,"platform":"twitch","accountId":null,"origin":"manual","recordedAt":"2026-09-20T17:37:25.659Z","createdAt":"2026-09-20T17:37:25.659Z"}},"schema":{"type":"object","properties":{"follower":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","description":"Follower record ID"},"followerCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Follower count"},"platform":{"type":"string","description":"Platform"},"accountId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider-native account ID"},"origin":{"type":"string","enum":["manual","provider","legacy"],"description":"How the observation entered ZeroCut"},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the follower count was recorded"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Record created at"}},"required":["id","followerCount","platform","accountId","origin","recordedAt","createdAt"],"additionalProperties":false},{"type":"null"}]}},"required":["follower"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Current Follower Count","x-displayName":"Current Follower Count","description":"Get the current (latest) follower count"},"/follower/stats":{"get":{"operationId":"get_follower_stats","summary":"Follower Stats","description":"Get follower growth statistics","tags":["Follower"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"platform","schema":{"description":"Filter by platform (e.g. twitch, youtube)","type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$"},"description":"Filter by platform (e.g. twitch, youtube)"},{"in":"query","name":"accountId","schema":{"description":"Filter by a provider-native account ID (requires platform)","type":"string"},"description":"Filter by a provider-native account ID (requires platform)"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"totalFollowers":1500,"followersToday":10,"followersThisMonth":150},"schema":{"type":"object","properties":{"totalFollowers":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Current total follower count"},"followersToday":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"New follower records today"},"followersThisMonth":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"New follower records this month"}},"required":["totalFollowers","followersToday","followersThisMonth"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Follower Stats","x-displayName":"Follower Stats","description":"Get follower growth statistics"},"/follower/byDateRange":{"get":{"operationId":"get_follower_byDateRange","summary":"Followers by Date Range","description":"Get historical follower counts per day within a date range","tags":["Follower"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"days","schema":{"description":"Number of days to look back (1-365, default 30)","default":30,"type":"integer","minimum":1,"maximum":365},"description":"Number of days to look back (1-365, default 30)"},{"in":"query","name":"platform","schema":{"description":"Filter by platform (e.g. twitch, youtube)","type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$"},"description":"Filter by platform (e.g. twitch, youtube)"},{"in":"query","name":"accountId","schema":{"description":"Filter by a provider-native account ID (requires platform)","type":"string"},"description":"Filter by a provider-native account ID (requires platform)"},{"in":"query","name":"startDate","schema":{"description":"Start date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"Start date (ISO 8601). Provide startDate and endDate together."},{"in":"query","name":"endDate","schema":{"description":"End date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"End date (ISO 8601). Provide startDate and endDate together."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"followers":[{"date":"2024-01-15","followerCount":1000},{"date":"2024-01-16","followerCount":1010}]},"schema":{"type":"object","properties":{"followers":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date (YYYY-MM-DD)"},"followerCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Follower count"}},"required":["date","followerCount"],"additionalProperties":false}}},"required":["followers"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Followers by Date Range","x-displayName":"Followers by Date Range","description":"Get historical follower counts per day within a date range"},"/follower/update":{"post":{"operationId":"post_follower_update","summary":"Update Follower Count","description":"Update/upsert the follower count","tags":["Follower"],"security":[{"API Key":[]}],"requestBody":{"required":true,"content":{"application/json":{"example":{"followerCount":1500,"platform":"twitch","accountId":null},"schema":{"allOf":[{"type":"object","properties":{"followerCount":{"type":"integer","minimum":0,"maximum":1000000000,"description":"Current follower count"}},"required":["followerCount"]},{"anyOf":[{"type":"object","properties":{"platform":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$","description":"Platform that owns this follower count","example":"twitch"},"source":{"default":"api","description":"Legacy producer label; not returned in follower DTOs","example":"api","type":"string","maxLength":80,"pattern":"^[a-z0-9][a-z0-9_-]{0,79}$"},"accountId":{"description":"Provider-native account ID. Omit or pass null only for a platform-wide manual value.","anyOf":[{"type":"string"},{"type":"null"}]}},"required":["platform"]},{"type":"object","properties":{"platform":{"not":{}},"source":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$","description":"Compatibility form: source names the platform","example":"twitch"},"accountId":{"description":"Provider-native account ID. Omit or pass null only for a platform-wide manual value.","anyOf":[{"type":"string"},{"type":"null"}]}},"required":["source"]}],"description":"Name platform explicitly or use the legacy source-as-platform form.","example":{"platform":"twitch","source":"api","accountId":null}}],"example":{"followerCount":1500,"platform":"twitch","accountId":null}}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"id":"test-user-id-1234567890","followerCount":1500,"platform":"twitch","accountId":null,"origin":"manual","recordedAt":"2026-09-20T17:37:25.661Z","createdAt":"2026-09-20T17:37:25.661Z"},"schema":{"type":"object","properties":{"id":{"type":"string","description":"Follower record ID"},"followerCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Follower count"},"platform":{"type":"string","description":"Platform"},"accountId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider-native account ID"},"origin":{"type":"string","enum":["manual","provider","legacy"],"description":"How the observation entered ZeroCut"},"recordedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the follower count was recorded"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Record created at"}},"required":["id","followerCount","platform","accountId","origin","recordedAt","createdAt"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Update Follower Count","x-displayName":"Update Follower Count","description":"Update/upsert the follower count"},"/live-session/create":{"post":{"operationId":"post_live-session_create","summary":"Add Live Session","description":"Add a live streaming session record","tags":["Live Session"],"security":[{"API Key":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$","description":"Platform name (e.g., 'twitch', 'youtube')"},"accountId":{"description":"Provider-native account ID","anyOf":[{"type":"string"},{"type":"null"}]},"startTime":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Session start time (ISO 8601)"},"endTime":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Session end time (ISO 8601)"},"peakViewerCount":{"description":"Peak viewer count during the session","type":"integer","minimum":0,"maximum":100000000},"finalViewerCount":{"description":"Final viewer count at session end","type":"integer","minimum":0,"maximum":100000000}},"required":["platform","startTime","endTime"]}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"id":"00000000-0000-0000-0000-000000000000","userId":"test-user-id","platform":"twitch","accountId":null,"startTime":"2026-09-20T17:37:25.662Z","endTime":"2026-09-20T18:37:25.662Z","peakViewerCount":500,"finalViewerCount":450,"createdAt":"2026-09-20T17:37:25.662Z","updatedAt":"2026-09-20T17:37:25.662Z"},"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Session ID"},"userId":{"type":"string","description":"User ID"},"platform":{"type":"string","description":"Platform name"},"accountId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider-native account ID"},"startTime":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Session start time"},"endTime":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"Session end time"},"peakViewerCount":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Peak viewer count"},"finalViewerCount":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Final viewer count"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the record was created"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the record was last updated"}},"required":["id","userId","platform","accountId","startTime","endTime","peakViewerCount","finalViewerCount","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Add Live Session","x-displayName":"Add Live Session","description":"Add a live streaming session record"},"/live-session/list":{"get":{"operationId":"get_live-session_list","summary":"List Live Sessions","description":"Get a paginated list of live sessions","tags":["Live Session"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"limit","schema":{"description":"Max results to return (1-100, default 50)","default":50,"type":"integer","minimum":1,"maximum":100},"description":"Max results to return (1-100, default 50)"},{"in":"query","name":"cursor","schema":{"description":"Cursor for pagination (pass nextCursor from previous response)","type":"string","maxLength":256},"description":"Cursor for pagination (pass nextCursor from previous response)"},{"in":"query","name":"platform","schema":{"description":"Filter by platform (e.g. twitch, youtube)","type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$"},"description":"Filter by platform (e.g. twitch, youtube)"},{"in":"query","name":"accountId","schema":{"description":"Filter by a provider-native account ID (requires platform)","type":"string"},"description":"Filter by a provider-native account ID (requires platform)"},{"in":"query","name":"includeIncomplete","schema":{"description":"Include sessions without an end time (default false)","type":"string","enum":["true","false"]},"description":"Include sessions without an end time (default false)"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"sessions":[{"id":"00000000-0000-0000-0000-000000000000","platform":"twitch","accountId":null,"startTime":"2026-09-20T17:37:25.662Z","endTime":"2026-09-20T18:37:25.662Z","peakViewerCount":500,"finalViewerCount":450,"externalSessionId":null,"note":null,"createdAt":"2026-09-20T17:37:25.662Z","updatedAt":"2026-09-20T17:37:25.662Z"}],"nextCursor":null},"schema":{"type":"object","properties":{"sessions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Session ID"},"platform":{"type":"string","description":"Platform name"},"accountId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider-native account ID"},"startTime":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Session start time"},"endTime":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"Session end time"},"peakViewerCount":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Peak viewer count"},"finalViewerCount":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Final viewer count"},"externalSessionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"External platform session ID"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Session note"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Record created at"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Record last updated at"}},"required":["id","platform","accountId","startTime","endTime","peakViewerCount","finalViewerCount","externalSessionId","note","createdAt","updatedAt"],"additionalProperties":false}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor for next page"}},"required":["sessions","nextCursor"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"List Live Sessions","x-displayName":"List Live Sessions","description":"Get a paginated list of live sessions"},"/live-session/getById":{"get":{"operationId":"get_live-session_getById","summary":"Get Live Session","description":"Get a live session by ID with associated donations","tags":["Live Session"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Session ID"},"required":true,"description":"Session ID"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"session":{"id":"00000000-0000-0000-0000-000000000000","platform":"twitch","accountId":null,"startTime":"2026-09-20T17:37:25.663Z","endTime":"2026-09-20T18:37:25.663Z","peakViewerCount":500,"finalViewerCount":450,"externalSessionId":null,"note":null,"createdAt":"2026-09-20T17:37:25.663Z","updatedAt":"2026-09-20T17:37:25.663Z"},"donations":[]},"schema":{"type":"object","properties":{"session":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Session ID"},"platform":{"type":"string","description":"Platform name"},"accountId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider-native account ID"},"startTime":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Session start time"},"endTime":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"Session end time"},"peakViewerCount":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Peak viewer count"},"finalViewerCount":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Final viewer count"},"externalSessionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"External platform session ID"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Session note"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Record created at"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Record last updated at"}},"required":["id","platform","accountId","startTime","endTime","peakViewerCount","finalViewerCount","externalSessionId","note","createdAt","updatedAt"],"additionalProperties":false},{"type":"null"}]},"donations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Donation ID"},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Amount in cents"},"currency":{"type":"string","enum":["aed","afn","all","amd","ang","aoa","ars","aud","awg","azn","bam","bbd","bdt","bgn","bif","bmd","bnd","bob","brl","bsd","bwp","byn","bzd","cad","cdf","chf","clp","cny","cop","crc","cve","czk","djf","dkk","dop","dzd","egp","etb","eur","fjd","fkp","gbp","gel","gip","gmd","gnf","gtq","gyd","hkd","hnl","hrk","htg","huf","idr","ils","inr","isk","jmd","jpy","kes","kgs","khr","kmf","krw","kyd","kzt","lak","lbp","lkr","lrd","lsl","mad","mdl","mga","mkd","mmk","mnt","mop","mro","mur","mvr","mwk","mxn","myr","mzn","nad","ngn","nio","nok","npr","nzd","pab","pen","pgk","php","pkr","pln","pyg","qar","ron","rsd","rub","rwf","sar","sbd","scr","sek","sgd","shp","sle","sll","sos","srd","std","stn","szl","thb","tjs","top","try","ttd","twd","tzs","uah","ugx","usd","uyu","uzs","vnd","vuv","wst","xaf","xcd","xof","xpf","yer","zar","zmw","zwl"],"description":"Currency code (ISO 4217)"},"donorName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Donor name"},"donorEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Donor email"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Donation message"},"perk":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Purchased perk ID"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Frozen perk title"}},"required":["id","title"],"additionalProperties":false},{"type":"null"}],"description":"Legacy single-perk reference, or null for carts and donations without a perk"},"perks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Purchased perk ID"},"title":{"type":"string","description":"Frozen perk title"},"quantity":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Purchased quantity"},"unitAmount":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Frozen unit price in minor currency units"},"lineTotal":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Frozen line total in minor currency units"},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"Uppercase ISO 4217 currency code"}},"required":["id","title","quantity","unitAmount","lineTotal","currency"],"additionalProperties":false},"description":"Frozen purchased perk lines; empty for donations without a cart snapshot"},"paymentMethodLast4":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Last 4 digits of payment method"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Country code"},"discordUserId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Discord user ID if connected"},"discordRoleAssigned":{"type":"boolean","description":"Whether Discord role was assigned"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the donation was created"}},"required":["id","amount","currency","donorName","donorEmail","message","perk","perks","paymentMethodLast4","country","discordUserId","discordRoleAssigned","createdAt"],"additionalProperties":false}}},"required":["session","donations"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Get Live Session","x-displayName":"Get Live Session","description":"Get a live session by ID with associated donations"},"/live-session/events":{"get":{"operationId":"get_live-session_events","summary":"Get Session Events","description":"Get events for a live session","tags":["Live Session"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"sessionId","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Session ID"},"required":true,"description":"Session ID"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"events":[{"id":"00000000-0000-0000-0000-000000000000","sessionId":"00000000-0000-0000-0000-000000000001","type":"KEY_MOMENT","description":"Started playing","metadata":"{\"activity\":\"Just Chatting\"}","timestamp":"2026-09-20T17:37:25.664Z","createdAt":"2026-09-20T17:37:25.664Z"}]},"schema":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Event ID"},"sessionId":{"type":"string","description":"Session ID"},"type":{"type":"string","description":"Event type"},"description":{"type":"string","description":"Event description"},"metadata":{"type":"string","description":"Event metadata (JSON string)"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Event timestamp"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Record created at"}},"required":["id","sessionId","type","description","metadata","timestamp","createdAt"],"additionalProperties":false}}},"required":["events"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Get Session Events","x-displayName":"Get Session Events","description":"Get events for a live session"},"/live-session/addEvent":{"post":{"operationId":"post_live-session_addEvent","summary":"Add Session Event","description":"Add an event to a live session","tags":["Live Session"],"security":[{"API Key":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sessionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Session ID"},"type":{"type":"string","maxLength":80,"pattern":"^[a-z0-9][a-z0-9_-]{0,79}$","description":"Event type (e.g. KEY_MOMENT)"},"description":{"type":"string","maxLength":1000,"description":"Event description"},"metadata":{"default":"{}","description":"Event metadata as JSON string","type":"string","maxLength":4000},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Event timestamp (ISO 8601)"}},"required":["sessionId","type","description","timestamp"]}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"id":"00000000-0000-0000-0000-000000000000","sessionId":"00000000-0000-0000-0000-000000000001","type":"KEY_MOMENT","description":"Started playing","metadata":"{\"activity\":\"Just Chatting\"}","timestamp":"2026-09-20T17:37:25.664Z","createdAt":"2026-09-20T17:37:25.664Z"},"schema":{"type":"object","properties":{"id":{"type":"string","description":"Event ID"},"sessionId":{"type":"string","description":"Session ID"},"type":{"type":"string","description":"Event type"},"description":{"type":"string","description":"Event description"},"metadata":{"type":"string","description":"Event metadata (JSON string)"},"timestamp":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Event timestamp"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Record created at"}},"required":["id","sessionId","type","description","metadata","timestamp","createdAt"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Add Session Event","x-displayName":"Add Session Event","description":"Add an event to a live session"},"/live-session/update":{"post":{"operationId":"post_live-session_update","summary":"Update Live Session","description":"Update a live session","tags":["Live Session"],"security":[{"API Key":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Session ID"},"startTime":{"description":"Updated start time (ISO 8601)","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"endTime":{"description":"Updated end time (ISO 8601)","anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}]},"peakViewerCount":{"description":"Updated peak viewer count","anyOf":[{"type":"integer","minimum":0,"maximum":100000000},{"type":"null"}]},"finalViewerCount":{"description":"Updated final viewer count","anyOf":[{"type":"integer","minimum":0,"maximum":100000000},{"type":"null"}]},"note":{"description":"Updated note","anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]}},"required":["id"]}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"id":"00000000-0000-0000-0000-000000000000","platform":"twitch","accountId":null,"startTime":"2026-09-20T17:37:25.664Z","endTime":"2026-09-20T18:37:25.664Z","peakViewerCount":500,"finalViewerCount":450,"externalSessionId":null,"note":"Updated note","createdAt":"2026-09-20T17:37:25.664Z","updatedAt":"2026-09-20T17:37:25.664Z"},"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Session ID"},"platform":{"type":"string","description":"Platform name"},"accountId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider-native account ID"},"startTime":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Session start time"},"endTime":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"Session end time"},"peakViewerCount":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Peak viewer count"},"finalViewerCount":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}],"description":"Final viewer count"},"externalSessionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"External platform session ID"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Session note"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Record created at"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Record last updated at"}},"required":["id","platform","accountId","startTime","endTime","peakViewerCount","finalViewerCount","externalSessionId","note","createdAt","updatedAt"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Update Live Session","x-displayName":"Update Live Session","description":"Update a live session"},"/live-session/delete":{"post":{"operationId":"post_live-session_delete","summary":"Delete Live Session","description":"Delete a live session","tags":["Live Session"],"security":[{"API Key":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Session ID to delete"}},"required":["id"]}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"success":true},"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the deletion succeeded"}},"required":["success"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Delete Live Session","x-displayName":"Delete Live Session","description":"Delete a live session"},"/analytics/overview":{"get":{"operationId":"get_analytics_overview","summary":"Analytics Overview","description":"Get KPI summary: revenue, donations, sessions, live hours","tags":["Analytics"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"days","schema":{"description":"Number of days to look back (1-365, default 30)","default":30,"type":"integer","minimum":1,"maximum":365},"description":"Number of days to look back (1-365, default 30)"},{"in":"query","name":"timezone","schema":{"description":"IANA timezone (e.g. America/New_York)","default":"UTC","type":"string"},"description":"IANA timezone (e.g. America/New_York)"},{"in":"query","name":"platform","schema":{"description":"Filter by platform (e.g. twitch, youtube)","type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$"},"description":"Filter by platform (e.g. twitch, youtube)"},{"in":"query","name":"accountId","schema":{"description":"Filter by a provider-native account ID (requires platform)","type":"string"},"description":"Filter by a provider-native account ID (requires platform)"},{"in":"query","name":"startDate","schema":{"description":"Start date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"Start date (ISO 8601). Provide startDate and endDate together."},{"in":"query","name":"endDate","schema":{"description":"End date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"End date (ISO 8601). Provide startDate and endDate together."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"totals":{"revenue":500,"donationRevenue":500,"donationsCount":25},"sessions":{"count":10,"liveMinutes":1200,"liveHours":20},"kpis":{"avgRevenuePerSession":50,"revenuePerLiveHour":25}},"schema":{"type":"object","properties":{"totals":{"type":"object","properties":{"revenue":{"type":"number","description":"Total revenue in dollars"},"donationRevenue":{"type":"number","description":"Donation revenue in dollars"},"donationsCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of donations"}},"required":["revenue","donationRevenue","donationsCount"],"additionalProperties":false},"sessions":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of sessions"},"liveMinutes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Total live minutes"},"liveHours":{"type":"number","description":"Total live hours"}},"required":["count","liveMinutes","liveHours"],"additionalProperties":false},"kpis":{"type":"object","properties":{"avgRevenuePerSession":{"type":"number","description":"Average revenue per session in dollars"},"revenuePerLiveHour":{"type":"number","description":"Revenue per live hour in dollars"}},"required":["avgRevenuePerSession","revenuePerLiveHour"],"additionalProperties":false}},"required":["totals","sessions","kpis"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Analytics Overview","x-displayName":"Analytics Overview","description":"Get KPI summary: revenue, donations, sessions, live hours"},"/analytics/daily":{"get":{"operationId":"get_analytics_daily","summary":"Daily Analytics","description":"Get day-by-day time series analytics (up to 120 days)","tags":["Analytics"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"days","schema":{"description":"Number of days to look back (1-120, default 30)","default":30,"type":"integer","minimum":1,"maximum":120},"description":"Number of days to look back (1-120, default 30)"},{"in":"query","name":"timezone","schema":{"description":"IANA timezone (e.g. America/New_York)","default":"UTC","type":"string"},"description":"IANA timezone (e.g. America/New_York)"},{"in":"query","name":"platform","schema":{"description":"Filter by platform (e.g. twitch, youtube)","type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$"},"description":"Filter by platform (e.g. twitch, youtube)"},{"in":"query","name":"accountId","schema":{"description":"Filter by a provider-native account ID (requires platform)","type":"string"},"description":"Filter by a provider-native account ID (requires platform)"},{"in":"query","name":"startDate","schema":{"description":"Start date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"Start date (ISO 8601). Provide startDate and endDate together."},{"in":"query","name":"endDate","schema":{"description":"End date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"End date (ISO 8601). Provide startDate and endDate together."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"daily":[{"date":"2024-01-15","formattedDate":"Jan 15","amountsByCurrency":{"usd":5000},"donationCount":3,"liveMinutes":120,"liveMinutesByPlatform":{"twitch":120},"sessions":1,"followerCounts":{"twitch":1000},"maxViewerCount":50}]},"schema":{"type":"object","properties":{"daily":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date (YYYY-MM-DD)"},"formattedDate":{"type":"string","description":"Human-readable date (e.g. Mar 15)"},"amountsByCurrency":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"},"description":"Donation amounts by currency in cents"},"donationCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of donations"},"liveMinutes":{"type":"number","description":"Live minutes"},"liveMinutesByPlatform":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"},"description":"Live minutes by platform"},"sessions":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of sessions"},"followerCounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"},"description":"Follower counts by platform"},"maxViewerCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Peak viewer count"}},"required":["date","formattedDate","amountsByCurrency","donationCount","liveMinutes","liveMinutesByPlatform","sessions","followerCounts","maxViewerCount"],"additionalProperties":false}}},"required":["daily"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Daily Analytics","x-displayName":"Daily Analytics","description":"Get day-by-day time series analytics (up to 120 days)"},"/analytics/hourly":{"get":{"operationId":"get_analytics_hourly","summary":"Hourly Analytics","description":"Get hour-by-hour time series analytics (up to 7 days)","tags":["Analytics"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"days","schema":{"description":"Number of days to look back (1-7, default 1)","default":1,"type":"integer","minimum":1,"maximum":7},"description":"Number of days to look back (1-7, default 1)"},{"in":"query","name":"timezone","schema":{"description":"IANA timezone (e.g. America/New_York)","default":"UTC","type":"string"},"description":"IANA timezone (e.g. America/New_York)"},{"in":"query","name":"platform","schema":{"description":"Filter by platform (e.g. twitch, youtube)","type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$"},"description":"Filter by platform (e.g. twitch, youtube)"},{"in":"query","name":"accountId","schema":{"description":"Filter by a provider-native account ID (requires platform)","type":"string"},"description":"Filter by a provider-native account ID (requires platform)"},{"in":"query","name":"startDate","schema":{"description":"Start date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"Start date (ISO 8601). Provide startDate and endDate together."},{"in":"query","name":"endDate","schema":{"description":"End date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"End date (ISO 8601). Provide startDate and endDate together."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"hourly":[{"hourIso":"2024-01-15T14:00:00Z","hourLabel":"14:00","amountsByCurrency":{"usd":2000},"donationCount":2,"liveMinutes":60,"liveMinutesByPlatform":{"twitch":60},"sessions":1,"followerCounts":{"twitch":1000},"maxViewerCount":45}]},"schema":{"type":"object","properties":{"hourly":{"type":"array","items":{"type":"object","properties":{"hourIso":{"type":"string","description":"Hour ISO timestamp"},"hourLabel":{"type":"string","description":"Hour label (e.g. 14:00)"},"amountsByCurrency":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"},"description":"Donation amounts by currency in cents"},"donationCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of donations"},"liveMinutes":{"type":"number","description":"Live minutes"},"liveMinutesByPlatform":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"},"description":"Live minutes by platform"},"sessions":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of sessions"},"followerCounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"},"description":"Follower counts by platform"},"maxViewerCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Peak viewer count"}},"required":["hourIso","hourLabel","amountsByCurrency","donationCount","liveMinutes","liveMinutesByPlatform","sessions","followerCounts","maxViewerCount"],"additionalProperties":false}}},"required":["hourly"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Hourly Analytics","x-displayName":"Hourly Analytics","description":"Get hour-by-hour time series analytics (up to 7 days)"},"/analytics/weekly":{"get":{"operationId":"get_analytics_weekly","summary":"Weekly Analytics","description":"Get week-by-week time series analytics (up to 365 days)","tags":["Analytics"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"days","schema":{"description":"Number of days to look back (7-365, default 90)","default":90,"type":"integer","minimum":7,"maximum":365},"description":"Number of days to look back (7-365, default 90)"},{"in":"query","name":"timezone","schema":{"description":"IANA timezone (e.g. America/New_York)","default":"UTC","type":"string"},"description":"IANA timezone (e.g. America/New_York)"},{"in":"query","name":"platform","schema":{"description":"Filter by platform (e.g. twitch, youtube)","type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$"},"description":"Filter by platform (e.g. twitch, youtube)"},{"in":"query","name":"accountId","schema":{"description":"Filter by a provider-native account ID (requires platform)","type":"string"},"description":"Filter by a provider-native account ID (requires platform)"},{"in":"query","name":"startDate","schema":{"description":"Start date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"Start date (ISO 8601). Provide startDate and endDate together."},{"in":"query","name":"endDate","schema":{"description":"End date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"End date (ISO 8601). Provide startDate and endDate together."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"weekly":[{"date":"2024-01-15","formattedDate":"Jan 15","amountsByCurrency":{"usd":15000},"donationCount":10,"liveMinutes":600,"liveMinutesByPlatform":{"twitch":600},"sessions":5,"followerCounts":{"twitch":1050},"maxViewerCount":100}]},"schema":{"type":"object","properties":{"weekly":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Week start date (YYYY-MM-DD)"},"formattedDate":{"type":"string","description":"Human-readable date (e.g. Mar 15)"},"amountsByCurrency":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"},"description":"Donation amounts by currency in cents"},"donationCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of donations"},"liveMinutes":{"type":"number","description":"Live minutes"},"liveMinutesByPlatform":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"},"description":"Live minutes by platform"},"sessions":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of sessions"},"followerCounts":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"},"description":"Follower counts by platform"},"maxViewerCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Peak viewer count"}},"required":["date","formattedDate","amountsByCurrency","donationCount","liveMinutes","liveMinutesByPlatform","sessions","followerCounts","maxViewerCount"],"additionalProperties":false}}},"required":["weekly"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Weekly Analytics","x-displayName":"Weekly Analytics","description":"Get week-by-week time series analytics (up to 365 days)"},"/analytics/activities":{"get":{"operationId":"get_analytics_activities","summary":"Top Activities","description":"Get top stream activities by duration","tags":["Analytics"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"platform","schema":{"description":"Filter by platform (e.g. twitch, youtube)","type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,31}$"},"description":"Filter by platform (e.g. twitch, youtube)"},{"in":"query","name":"accountId","schema":{"description":"Filter by a provider-native account ID (requires platform)","type":"string"},"description":"Filter by a provider-native account ID (requires platform)"},{"in":"query","name":"startDate","schema":{"description":"Start date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"Start date (ISO 8601). Provide startDate and endDate together."},{"in":"query","name":"endDate","schema":{"description":"End date (ISO 8601). Provide startDate and endDate together.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"description":"End date (ISO 8601). Provide startDate and endDate together."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"activities":[{"name":"Just Chatting","durationMinutes":300,"sessionCount":5,"revenue":0}]},"schema":{"type":"object","properties":{"activities":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Activity name"},"durationMinutes":{"type":"number","description":"Total duration in minutes"},"sessionCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Number of sessions with this activity"},"revenue":{"type":"number","description":"Revenue associated in dollars"}},"required":["name","durationMinutes","sessionCount","revenue"],"additionalProperties":false}}},"required":["activities"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Top Activities","x-displayName":"Top Activities","description":"Get top stream activities by duration"},"/analytics/oldest":{"get":{"operationId":"get_analytics_oldest","summary":"Oldest Data","description":"Get the timestamp of the oldest data point for the user","tags":["Analytics"],"security":[{"API Key":[]}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"oldestDate":"2023-06-15T00:00:00.000Z"},"schema":{"type":"object","properties":{"oldestDate":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"ISO 8601 timestamp of oldest data point, or null if no data"}},"required":["oldestDate"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Oldest Data","x-displayName":"Oldest Data","description":"Get the timestamp of the oldest data point for the user"},"/goal/list":{"get":{"operationId":"get_goal_list","summary":"List Goals","description":"Get all donation goals with progress","tags":["Goal"],"security":[{"API Key":[]}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"goals":[{"id":"00000000-0000-0000-0000-000000000000","amount":100000,"description":"New microphone","isTimeBound":false,"startDate":null,"endDate":null,"isCompleted":false,"completedAt":null,"isActive":true,"showOnEmbed":true,"progress":[{"total":45000,"currency":"usd"}],"createdAt":"2026-09-20T17:37:25.666Z","updatedAt":"2026-09-20T17:37:25.666Z"}]},"schema":{"type":"object","properties":{"goals":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Goal ID"},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Target amount in cents"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Goal description"},"isTimeBound":{"type":"boolean","description":"Whether goal has a time range"},"startDate":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"Goal start date"},"endDate":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"Goal end date"},"isCompleted":{"type":"boolean","description":"Whether goal is completed"},"completedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"When goal was completed"},"isActive":{"type":"boolean","description":"Whether goal is active"},"showOnEmbed":{"type":"boolean","description":"Whether shown on embed"},"progress":{"type":"array","items":{"type":"object","properties":{"total":{"type":"number","description":"Total amount donated in cents"},"currency":{"type":"string","description":"Currency code"}},"required":["total","currency"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When goal was created"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When goal was last updated"}},"required":["id","amount","description","isTimeBound","startDate","endDate","isCompleted","completedAt","isActive","showOnEmbed","progress","createdAt","updatedAt"],"additionalProperties":false}}},"required":["goals"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"List Goals","x-displayName":"List Goals","description":"Get all donation goals with progress"},"/goal/getById":{"get":{"operationId":"get_goal_getById","summary":"Get Goal","description":"Get a single donation goal with progress","tags":["Goal"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"id","schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Goal ID"},"required":true,"description":"Goal ID"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"id":"00000000-0000-0000-0000-000000000000","amount":100000,"description":"New microphone","isTimeBound":false,"startDate":null,"endDate":null,"isCompleted":false,"completedAt":null,"isActive":true,"showOnEmbed":true,"progress":[{"total":45000,"currency":"usd"}],"createdAt":"2026-09-20T17:37:25.667Z","updatedAt":"2026-09-20T17:37:25.667Z"},"schema":{"anyOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Goal ID"},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Target amount in cents"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Goal description"},"isTimeBound":{"type":"boolean","description":"Whether goal has a time range"},"startDate":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"Goal start date"},"endDate":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"Goal end date"},"isCompleted":{"type":"boolean","description":"Whether goal is completed"},"completedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"When goal was completed"},"isActive":{"type":"boolean","description":"Whether goal is active"},"showOnEmbed":{"type":"boolean","description":"Whether shown on embed"},"progress":{"type":"array","items":{"type":"object","properties":{"total":{"type":"number","description":"Total amount donated in cents"},"currency":{"type":"string","description":"Currency code"}},"required":["total","currency"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When goal was created"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When goal was last updated"}},"required":["id","amount","description","isTimeBound","startDate","endDate","isCompleted","completedAt","isActive","showOnEmbed","progress","createdAt","updatedAt"],"additionalProperties":false},{"type":"null"}]}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Get Goal","x-displayName":"Get Goal","description":"Get a single donation goal with progress"},"/goal/active":{"get":{"operationId":"get_goal_active","summary":"Active Goals","description":"Get active (non-completed) donation goals with progress","tags":["Goal"],"security":[{"API Key":[]}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"goals":[{"id":"00000000-0000-0000-0000-000000000000","amount":100000,"description":"New microphone","isTimeBound":false,"startDate":null,"endDate":null,"isCompleted":false,"showOnEmbed":true,"progress":[{"total":45000,"currency":"usd"}],"createdAt":"2026-09-20T17:37:25.667Z","updatedAt":"2026-09-20T17:37:25.667Z"}]},"schema":{"type":"object","properties":{"goals":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Goal ID"},"amount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Target amount in cents"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Goal description"},"isTimeBound":{"type":"boolean","description":"Whether goal has a time range"},"startDate":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"Goal start date"},"endDate":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},{"type":"null"}],"description":"Goal end date"},"isCompleted":{"type":"boolean","description":"Whether goal is completed"},"showOnEmbed":{"type":"boolean","description":"Whether shown on embed"},"progress":{"type":"array","items":{"type":"object","properties":{"total":{"type":"number","description":"Total amount donated in cents"},"currency":{"type":"string","description":"Currency code"}},"required":["total","currency"],"additionalProperties":false}},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When goal was created"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When goal was last updated"}},"required":["id","amount","description","isTimeBound","startDate","endDate","isCompleted","showOnEmbed","progress","createdAt","updatedAt"],"additionalProperties":false}}},"required":["goals"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Active Goals","x-displayName":"Active Goals","description":"Get active (non-completed) donation goals with progress"},"/profile/get":{"get":{"operationId":"get_profile_get","summary":"Get Profile","description":"Get your own profile information","tags":["Profile"],"security":[{"API Key":[]}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"id":"test-user-id","name":"Test User","email":"test@example.com","handle":"testuser","image":null,"timezone":"America/New_York","displayCurrency":"USD","defaultCurrency":"USD","createdAt":"2026-09-20T17:37:25.668Z"},"schema":{"type":"object","properties":{"id":{"type":"string","description":"User ID"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Display name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Email address"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"User handle"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Avatar URL"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"User timezone"},"displayCurrency":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Preferred display currency"},"defaultCurrency":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Default donation currency"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Account creation date"}},"required":["id","name","email","handle","image","timezone","displayCurrency","defaultCurrency","createdAt"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Get Profile","x-displayName":"Get Profile","description":"Get your own profile information"},"/events/stream-token":{"post":{"operationId":"post_events_stream-token","summary":"Create Event Stream Token","description":"Mint a single-use token for opening GET /api/v1/events/stream from a browser EventSource, which cannot send request headers. The token lives 60 seconds and authorises opening a stream, not holding one.","tags":["Events"],"security":[{"API Key":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"events":{"description":"Public event types the stream should deliver. Omit for all types.","example":["donation.created"],"maxItems":8,"type":"array","items":{"type":"string","enum":["donation.created","perks.purchased","follower.created","goal.reached"]}},"perkIds":{"description":"Perk ids that narrow donation.created and perks.purchased events. Omit to keep every purchase.","maxItems":10,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}}}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"streamToken":"zcst.0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"},"schema":{"type":"object","properties":{"streamToken":{"type":"string","description":"Single-use token to pass as the streamToken query parameter","example":"zcst.0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"When the token stops being accepted"},"expiresIn":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Token lifetime in seconds"}},"required":["streamToken","expiresAt","expiresIn"],"additionalProperties":false}}}},"400":{"description":"Invalid events or perkIds filter","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Premium API access required","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Event streaming is not available in test mode","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Create Event Stream Token","x-displayName":"Create Event Stream Token","description":"Mint a single-use token for opening GET /api/v1/events/stream from a browser EventSource, which cannot send request headers. The token lives 60 seconds and authorises opening a stream, not holding one."},"/visitors/aggregate":{"get":{"operationId":"get_visitors_aggregate","summary":"Visitor Aggregate","description":"Aggregate visitor stats for your handle page with % change vs previous period","tags":["Visitors"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"period","schema":{"description":"Time window. Presets: today, yesterday, last24h, last7d, last30d, last90d, wtd, month. Custom ranges use custom:YYYY-MM-DD:YYYY-MM-DD and may include up to 365 days.","default":"last30d","type":"string"},"description":"Time window. Presets: today, yesterday, last24h, last7d, last30d, last90d, wtd, month. Custom ranges use custom:YYYY-MM-DD:YYYY-MM-DD and may include up to 365 days."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"visitors":{"value":1200,"change":15},"pageviews":{"value":3400,"change":12},"bounce_rate":{"value":42,"change":-5},"visit_duration":{"value":92,"change":3},"visits":{"value":1500,"change":10}},"schema":{"type":"object","properties":{"visitors":{"type":"object","properties":{"value":{"type":"number","description":"Metric value"},"change":{"description":"% change vs previous period","type":"number"},"isNew":{"description":"True when previous period had no data","type":"boolean"}},"required":["value"],"additionalProperties":false},"pageviews":{"type":"object","properties":{"value":{"type":"number","description":"Metric value"},"change":{"description":"% change vs previous period","type":"number"},"isNew":{"description":"True when previous period had no data","type":"boolean"}},"required":["value"],"additionalProperties":false},"bounce_rate":{"type":"object","properties":{"value":{"type":"number","description":"Metric value"},"change":{"description":"% change vs previous period","type":"number"},"isNew":{"description":"True when previous period had no data","type":"boolean"}},"required":["value"],"additionalProperties":false},"visit_duration":{"type":"object","properties":{"value":{"type":"number","description":"Metric value"},"change":{"description":"% change vs previous period","type":"number"},"isNew":{"description":"True when previous period had no data","type":"boolean"}},"required":["value"],"additionalProperties":false},"visits":{"type":"object","properties":{"value":{"type":"number","description":"Metric value"},"change":{"description":"% change vs previous period","type":"number"},"isNew":{"description":"True when previous period had no data","type":"boolean"}},"required":["value"],"additionalProperties":false}},"required":["visitors","pageviews","bounce_rate","visit_duration","visits"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Visitor Aggregate","x-displayName":"Visitor Aggregate","description":"Aggregate visitor stats for your handle page with % change vs previous period"},"/visitors/timeseries":{"get":{"operationId":"get_visitors_timeseries","summary":"Visitor Timeseries","description":"Daily visitor timeseries. Historical days are cached for 24h; today is refreshed every 60s.","tags":["Visitors"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"period","schema":{"description":"Time window. Presets: today, yesterday, last24h, last7d, last30d, last90d, wtd, month. Custom ranges use custom:YYYY-MM-DD:YYYY-MM-DD and may include up to 365 days.","default":"last30d","type":"string"},"description":"Time window. Presets: today, yesterday, last24h, last7d, last30d, last90d, wtd, month. Custom ranges use custom:YYYY-MM-DD:YYYY-MM-DD and may include up to 365 days."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"points":[{"date":"2024-01-14","visitors":120,"pageviews":340,"visits":150},{"date":"2024-01-15","visitors":145,"pageviews":410,"visits":180}]},"schema":{"type":"object","properties":{"points":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","description":"Date (YYYY-MM-DD)"},"visitors":{"type":"number","description":"Unique visitors"},"pageviews":{"type":"number","description":"Pageviews"},"visits":{"type":"number","description":"Visits (sessions)"}},"required":["date","visitors","pageviews","visits"],"additionalProperties":false}}},"required":["points"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Visitor Timeseries","x-displayName":"Visitor Timeseries","description":"Daily visitor timeseries. Historical days are cached for 24h; today is refreshed every 60s."},"/visitors/breakdown":{"get":{"operationId":"get_visitors_breakdown","summary":"Visitor Breakdown","description":"Top-N breakdown of visitors by source, referrer, country, region, device, browser, or OS","tags":["Visitors"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"period","schema":{"description":"Time window. Presets: today, yesterday, last24h, last7d, last30d, last90d, wtd, month. Custom ranges use custom:YYYY-MM-DD:YYYY-MM-DD and may include up to 365 days.","default":"last30d","type":"string"},"description":"Time window. Presets: today, yesterday, last24h, last7d, last30d, last90d, wtd, month. Custom ranges use custom:YYYY-MM-DD:YYYY-MM-DD and may include up to 365 days."},{"in":"query","name":"property","schema":{"type":"string","enum":["visit:source","visit:referrer","visit:country","visit:region","visit:device","visit:browser","visit:os"],"description":"Property to break down by. One of visit:source, visit:referrer, visit:country, visit:region, visit:device, visit:browser, visit:os"},"required":true,"description":"Property to break down by. One of visit:source, visit:referrer, visit:country, visit:region, visit:device, visit:browser, visit:os"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"items":[{"source":"Direct / None","visitors":450,"pageviews":1200},{"source":"Twitter","visitors":210,"pageviews":580},{"source":"Twitch","visitors":90,"pageviews":240}]},"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"}]}}}},"required":["items"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Visitor Breakdown","x-displayName":"Visitor Breakdown","description":"Top-N breakdown of visitors by source, referrer, country, region, device, browser, or OS"},"/visitors/realtime":{"get":{"operationId":"get_visitors_realtime","summary":"Visitor Realtime","description":"Current live visitor count (site-wide, not filtered by handle — a limitation of site-wide tracking)","tags":["Visitors"],"security":[{"API Key":[]}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"visitors":7},"schema":{"type":"object","properties":{"visitors":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Current live visitor count site-wide"}},"required":["visitors"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Visitor Realtime","x-displayName":"Visitor Realtime","description":"Current live visitor count (site-wide, not filtered by handle — a limitation of site-wide tracking)"},"/visitors/goals":{"get":{"operationId":"get_visitors_goals","summary":"Visitor Goal Conversions","description":"Donation-event conversion stats for your handle page: unique donors, total donation events, and conversion rate","tags":["Visitors"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"period","schema":{"description":"Time window. Presets: today, yesterday, last24h, last7d, last30d, last90d, wtd, month. Custom ranges use custom:YYYY-MM-DD:YYYY-MM-DD and may include up to 365 days.","default":"last30d","type":"string"},"description":"Time window. Presets: today, yesterday, last24h, last7d, last30d, last90d, wtd, month. Custom ranges use custom:YYYY-MM-DD:YYYY-MM-DD and may include up to 365 days."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"uniques":42,"total":55,"conversionRate":3.5},"schema":{"type":"object","properties":{"uniques":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique visitors who triggered the donation event"},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Total donation events"},"conversionRate":{"type":"number","description":"Conversion rate (percent)"}},"required":["uniques","total","conversionRate"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Visitor Goal Conversions","x-displayName":"Visitor Goal Conversions","description":"Donation-event conversion stats for your handle page: unique donors, total donation events, and conversion rate"},"/visitors/donation-methods":{"get":{"operationId":"get_visitors_donation-methods","summary":"Visitor Donation Methods","description":"Breakdown of donation events by payment method for your handle page","tags":["Visitors"],"security":[{"API Key":[]}],"parameters":[{"in":"query","name":"period","schema":{"description":"Time window. Presets: today, yesterday, last24h, last7d, last30d, last90d, wtd, month. Custom ranges use custom:YYYY-MM-DD:YYYY-MM-DD and may include up to 365 days.","default":"last30d","type":"string"},"description":"Time window. Presets: today, yesterday, last24h, last7d, last30d, last90d, wtd, month. Custom ranges use custom:YYYY-MM-DD:YYYY-MM-DD and may include up to 365 days."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"example":{"methods":[{"paymentMethod":"card","events":40,"visitors":32},{"paymentMethod":"paypal","events":10,"visitors":9},{"paymentMethod":"cashapp","events":5,"visitors":5}]},"schema":{"type":"object","properties":{"methods":{"type":"array","items":{"type":"object","properties":{"paymentMethod":{"type":"string","description":"Payment method identifier"},"events":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Donation event count"},"visitors":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Unique visitors triggering this event"}},"required":["paymentMethod","events","visitors"],"additionalProperties":false}}},"required":["methods"],"additionalProperties":false}}}},"400":{"description":"Invalid request","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing, invalid, disabled, or expired API key","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"API access requires ZeroCut Premium","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"Method not allowed. Use the method in the Allow header.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Allow":{"description":"Supported HTTP methods","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded. Wait for Retry-After before retrying.","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","headers":{"RateLimit-Policy":{"description":"Quota policy, for example \"account\";q=60;w=60. Present after quota evaluation.","schema":{"type":"string"}},"RateLimit":{"description":"Remaining requests and seconds until capacity returns, for example \"account\";r=59;t=60.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Maximum requests in the applicable sliding window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the applicable sliding window","schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"description":"Unix timestamp in seconds when the oldest request leaves the window","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"summary":"Visitor Donation Methods","x-displayName":"Visitor Donation Methods","description":"Breakdown of donation events by payment method for your handle page"}},"components":{"schemas":{"ErrorResponse":{"type":"object","properties":{"error":{"type":"string","description":"Error message"},"code":{"type":"string"},"details":{"anyOf":[{},{"type":"null"}]}},"required":["error"],"additionalProperties":false}},"securitySchemes":{"API Key":{"type":"apiKey","in":"header","name":"x-api-key","description":"Create a key in /app/dashboard/settings/api-keys and send it in x-api-key. Keys grant access to their owner's API data and actions; per-key scopes and OAuth delegation are not supported. Requires ZeroCut Premium. See /docs/api for onboarding, rate limits, and versioning."}}}}