{"openapi":"3.1.0","info":{"title":"Starcovery API","version":"1","description":"Starcovery machine surface. Send API-Version: 1; every response carries API-Version: 1, the version served, whatever version the request sent. A JSON request body with a key its operation does not declare answers 400 `invalid_body` naming the key, and an operation that lists no request body takes none: send no body or `{}`."},"components":{"schemas":{"InvalidClaimAttemptTokenEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["InvalidClaimAttemptToken"]},"error":{"type":"string","enum":["invalid_token"]},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false},"InvalidBodyEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["InvalidBody"]},"error":{"type":"string","enum":["invalid_body"]},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false},"EmailTakenEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["EmailTaken"]},"error":{"type":"string","enum":["email_taken"]},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false},"UndeliverableEmailEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["UndeliverableEmail"]},"error":{"type":"string","enum":["undeliverable_email"]},"error_description":{"type":"string"}},"required":["error","error_description"],"additionalProperties":false},"UnconfiguredEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["Unconfigured"]},"error":{"type":"string","enum":["unconfigured"]}},"required":["error"],"additionalProperties":false},"RateLimitedEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["RateLimited"]},"error":{"type":"string","enum":["rate_limited"]},"error_description":{"type":"string"},"reason":{"type":"string","enum":["claim_required"],"description":"Present when the credential is a pre-claim agent token and a person claiming the agent identity raises the limit."}},"required":["error"],"additionalProperties":false},"InvalidClaimTokenEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["InvalidClaimToken"]},"error":{"type":"string","enum":["invalid_claim_token"]}},"required":["error"],"additionalProperties":false},"ClaimedOrInFlightEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["ClaimedOrInFlight"]},"error":{"type":"string","enum":["claimed_or_in_flight"]}},"required":["error"],"additionalProperties":false},"ClaimExpiredEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["ClaimExpired"]},"error":{"type":"string","enum":["claim_expired"]}},"required":["error"],"additionalProperties":false},"UnauthorizedEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["Unauthorized"]},"error":{"type":"string","enum":["unauthorized"]}},"required":["error"],"additionalProperties":false},"NotFoundEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["NotFound"]},"error":{"type":"string","enum":["not_found"]}},"required":["error"],"additionalProperties":false},"OutOfCreditsEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["OutOfCredits"]},"authUrl":{"type":"string","format":"uri"},"checkoutUrl":{"type":"string","format":"uri","description":"Stripe Checkout URL for the machine pack. Omitted when the caller cannot start Checkout, and on force_payment dry-run."},"error":{"type":"string","enum":["out_of_credits"]},"freeGrant":{"type":"string","enum":["identified_daily","none","unsigned_daily"],"description":"Paywall CTA kind. The force_payment dry run of an identified caller omits it."},"machinePayment":{"anyOf":[{"type":"object","properties":{"available":{"type":"boolean","enum":[true]},"dryRun":{"type":"string"},"retry":{"type":"string"}},"required":["available","dryRun","retry"],"additionalProperties":false},{"type":"object","properties":{"available":{"type":"boolean","enum":[false]},"hint":{"type":"string"}},"required":["available","hint"],"additionalProperties":false}],"description":"Machine Payment for the machine bundle. available is true only when this response carries a WWW-Authenticate: Payment challenge."},"packsUrl":{"type":"string","format":"uri"}},"required":["authUrl","error","machinePayment","packsUrl"],"additionalProperties":false},"InvalidQueryEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["InvalidQuery"]},"error":{"type":"string","enum":["invalid_query"]},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false},"RunTakenEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["RunTaken"]},"error":{"type":"string","enum":["run_taken"]}},"required":["error"],"additionalProperties":false},"MessageTakenEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["MessageTaken"]},"error":{"type":"string","enum":["message_taken"]}},"required":["error"],"additionalProperties":false},"TooLargeEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["TooLarge"]},"error":{"type":"string","enum":["too_large"]}},"required":["error"],"additionalProperties":false},"QuotaExceededEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["QuotaExceeded"]},"error":{"type":"string","enum":["quota_exceeded"]}},"required":["error"],"additionalProperties":false},"UnsupportedTypeEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["UnsupportedType"]},"error":{"type":"string","enum":["unsupported_type"]}},"required":["error"],"additionalProperties":false},"OrganizationFundingForbiddenEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["OrganizationFundingForbidden"]},"error":{"type":"string","enum":["organization_funding_forbidden"]}},"required":["error"],"additionalProperties":false},"CampaignRequestDeniedEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["CampaignRequestDenied"]},"error":{"type":"string","enum":["campaign_request_denied"]},"message":{"type":"string"},"reason":{"type":"string","enum":["already_open","already_sent","amount_ceiling","archived","contract_missing","creators_changed","disclosure_missing","market_information_missing","no_accepted","no_matches","not_open","posting_date_past"],"description":"`already_open`: a request of the same kind is already open on the campaign, or a match change or a campaign delete found a send request open; `already_sent`: a send request, a send request cancel, a match change, or a campaign delete found the campaign active; `amount_ceiling`: the quoted funding total is not a whole number of cents up to 2,147,483,647; `archived`: a send request, a funding request, or a match change found the campaign archived; `contract_missing`: the campaign has no saved contract; `creators_changed`: a creator accepted the proposal while the funding request was prepared; `disclosure_missing`: a send request found no captured disclosure; `market_information_missing`: a funding request found no market information answer; `no_accepted`: a funding request found no accepted creator who is not yet funded; `no_matches`: the campaign has no match with at least 1,000 followers; `not_open`: a send request cancel found no open send request on the campaign; `posting_date_past`: a send request found a creator posting date before today in UTC."}},"required":["error","message","reason"],"additionalProperties":false},"SendCancelForbiddenEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["SendCancelForbidden"]},"error":{"type":"string","enum":["send_cancel_forbidden"]}},"required":["error"],"additionalProperties":false},"CampaignMatchDeliveredEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["CampaignMatchDelivered"]},"error":{"type":"string","enum":["campaign_match_delivered"]}},"required":["error"],"additionalProperties":false},"CampaignFundingActiveEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["CampaignFundingActive"]},"error":{"type":"string","enum":["campaign_funding_active"]}},"required":["error"],"additionalProperties":false},"InvalidCampaignTermsEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["InvalidCampaignTerms"]},"error":{"type":"string","enum":["invalid_campaign_terms"]},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false},"MarketInformationLockedEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["MarketInformationLocked"]},"error":{"type":"string","enum":["market_information_locked"]}},"required":["error"],"additionalProperties":false},"ContractLockedEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["ContractLocked"]},"error":{"type":"string","enum":["contract_locked"]}},"required":["error"],"additionalProperties":false},"CampaignStatusLockedEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["CampaignStatusLocked"]},"error":{"type":"string","enum":["campaign_status_locked"]},"message":{"type":"string"},"reason":{"type":"string","enum":["not_sent","request_open","sent"],"description":"`not_sent`: the patch sets active on a campaign that is not archived or whose proposals were never sent; `request_open`: the patch archives a campaign that has a send or funding request open with the Starcovery team; `sent`: the patch returns a campaign to draft after its proposals were sent, while it is active or holds a delivery."}},"required":["error","message","reason"],"additionalProperties":false},"InvalidTicketEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["InvalidTicket"]},"error":{"type":"string","enum":["invalid_ticket"]}},"required":["error"],"additionalProperties":false},"SearchUnavailableEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["SearchUnavailable"]},"error":{"type":"string","enum":["search_unavailable"]},"error_description":{"type":"string"}},"required":["error","error_description"],"additionalProperties":false},"TakenDownEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["TakenDown"]},"error":{"type":"string","enum":["taken_down"]},"platform":{"type":"string","enum":["ig","tt"]}},"required":["error"],"additionalProperties":false},"TakenEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["Taken"]},"error":{"type":"string","enum":["taken"]},"platform":{"type":"string","enum":["ig","tt"]}},"required":["error"],"additionalProperties":false},"InFlightEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["InFlight"]},"error":{"type":"string","enum":["in_flight"]},"platform":{"type":"string","enum":["ig","tt"]}},"required":["error"],"additionalProperties":false},"HandleNotFoundEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["HandleNotFound"]},"error":{"type":"string","enum":["not_found"]},"platform":{"type":"string","enum":["ig","tt"]}},"required":["error","platform"],"additionalProperties":false},"ForbiddenEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["Forbidden"]},"error":{"type":"string","enum":["forbidden"]},"platform":{"type":"string","enum":["ig","tt"]}},"required":["error"],"additionalProperties":false},"NoContactEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["NoContact"]},"error":{"type":"string","enum":["not_found"]},"message":{"type":"string","enum":["Starcovery has no address for this creator."]},"reason":{"type":"string","enum":["no_contact"]}},"required":["error","message","reason"],"additionalProperties":false},"AgentKeyManagementForbiddenEncoded":{"type":"object","properties":{"_tag":{"type":"string","enum":["AgentKeyManagementForbidden"]},"error":{"type":"string","enum":["forbidden: only a browser session or a Settings API key can manage API keys"]},"reason":{"type":"string","enum":["claim_required"],"description":"Present when the credential is a pre-claim agent token, an agent access token issued before a human claimed the registration."}},"required":["error"],"additionalProperties":false}},"securitySchemes":{"bearer":{"type":"http","scheme":"Bearer"},"apiKey":{"description":"API key for a host that cannot set the Authorization header. Read only when Authorization carries no Bearer or DPoP credential: a request that sends both headers is answered by the Authorization credential alone, so a key here never overrides it.","type":"apiKey","name":"x-api-key","in":"header"},"session":{"description":"Better Auth browser session cookie. Its name carries the __Secure- prefix on an HTTPS origin, which is the server this document declares, and Better Auth authenticates that name alone. REST only; MCP rejects a session.","type":"apiKey","name":"__Secure-better-auth.session_token","in":"cookie"}}},"security":[],"tags":[{"name":"health","description":"Liveness of the machine surface."},{"name":"whoami","description":"Identity behind the credential on the request."},{"name":"keys","description":"API keys of the organization. Needs a browser session or an API key; an agent access token or an OAuth access token receives 403. An owner or admin lists and revokes every key of the organization, and a member lists and revokes only the keys that member minted. The role belongs to the user behind the credential, which for an API key is the user who minted it."},{"name":"billing","description":"Prepaid credit balance of the organization. Owners and admins buy credit packs and manage billing in the web app at /home?settings=billing."},{"name":"contact","description":"Paid reveal of a creator contact address."},{"name":"profileClaims","description":"Handle claims that bind an Instagram or TikTok profile to an organization."},{"name":"search","description":"Creator search and shortlist enrichment. Search is the live test call and takes a credential or none."},{"name":"videos","description":"Catalog lookups by video URL. Needs a credential."},{"name":"campaigns","description":"Organization campaigns: a goal, generated matches, an editable shortlist, attachments, and the Send Proposal and funding requests. Every campaign endpoint needs a credential."},{"name":"threads","description":"Search threads. A thread owns one running search, stores its turns beside the current brief and filters, and streams each turn as an AI SDK UI message stream that the caller can resume or stop."},{"name":"feedback","description":"Bug and feature reports."},{"name":"agent","description":"Agent registration and the claim that hands the identity to a human. Takes no credential."}],"servers":[{"description":"Production. Unsigned GET /api/search is the live test call. There is no separate sandbox host.","url":"https://www.starcovery.com"}],"paths":{"/api/health":{"get":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"],"additionalProperties":false}}}}},"security":[],"tags":["health"],"operationId":"health.health","parameters":[],"description":"Answers `{ \"ok\": true }` while the api service is up. Takes no credential.","summary":"Check service health"}},"/api/whoami":{"get":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"billing":{"anyOf":[{"type":"object","properties":{"balance":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cardOnFile":{"type":"boolean"},"lastPack":{"anyOf":[{"type":"string","enum":["25","100","500","2000"],"description":"Prepaid credit pack, named by its price in US dollars. Credits are $0.05 each, and larger packs add bonus credits."},{"type":"null"}]},"dailySearches":{"type":"null"},"freeGrant":{"type":"string","enum":["none"]}},"required":["balance","cardOnFile","lastPack","dailySearches","freeGrant"],"additionalProperties":false},{"type":"object","properties":{"balance":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cardOnFile":{"type":"boolean"},"lastPack":{"anyOf":[{"type":"string","enum":["25","100","500","2000"],"description":"Prepaid credit pack, named by its price in US dollars. Credits are $0.05 each, and larger packs add bonus credits."},{"type":"null"}]},"dailySearches":{"type":"object","properties":{"limit":{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0},"remaining":{"type":"integer","minimum":0,"maximum":9007199254740991},"resetAt":{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0}},"required":["limit","remaining","resetAt"],"additionalProperties":false},"freeGrant":{"type":"string","enum":["identified_daily"]}},"required":["balance","cardOnFile","lastPack","dailySearches","freeGrant"],"additionalProperties":false}]},"credential":{"type":"object","properties":{"id":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"kind":{"type":"string","enum":["api_key","oauth","session"]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"prefix":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","kind","name","prefix"],"additionalProperties":false},"nextSearchCreditSource":{"type":"string","enum":["user_free_grant","organization_balance"]},"organizationId":{"type":"string","minLength":1},"searchCreditOrder":{"type":"array","items":{"type":"string","enum":["user_free_grant","organization_balance"]}},"userId":{"type":"string","minLength":1}},"required":["billing","credential","nextSearchCreditSource","organizationId","searchCreditOrder","userId"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["whoami"],"operationId":"whoami.whoami","parameters":[],"description":"Returns the credential on the request, the user and organization it resolves to, and whether the next search draws on the daily grant or the organization balance.","summary":"Read current identity"}},"/api/keys":{"get":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"keys":{"type":"array","items":{"type":"object","properties":{"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"id":{"type":"string","minLength":1},"lastRequest":{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"start":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Key prefix for display"}},"required":["createdAt","id","lastRequest","name","start"],"additionalProperties":false}}},"required":["keys"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"403":{"description":"The caller authenticates with an agent access token or an OAuth access token. Neither can list, create, or revoke API keys; a browser session or a Settings API key can.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentKeyManagementForbiddenEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["keys"],"operationId":"keys.listKeys","parameters":[],"description":"Lists the API keys of the organization that the caller may revoke: id, name, prefix, and timestamps. Never returns a plaintext key.","summary":"List API keys"},"post":{"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"object","properties":{"id":{"type":"string","minLength":1},"key":{"type":"string","minLength":1,"description":"Plaintext secret; returned only on create"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","key","name"],"additionalProperties":false}},"required":["key"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"403":{"description":"The caller authenticates with an agent access token or an OAuth access token. Neither can list, create, or revoke API keys; a browser session or a Settings API key can.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentKeyManagementForbiddenEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["keys"],"operationId":"keys.createKey","parameters":[],"description":"Mints an API key for the organization and returns the plaintext key once. Store it on receipt. A key minted with an API key is an ordinary key of the same member, not a child of the minting key: it is listed and revoked on its own, and revoking the key that minted it leaves it working.","summary":"Create API key","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Key label; must not start with agent:","maxLength":64,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$"}},"required":["name"],"additionalProperties":false}}},"required":true}}},"/api/keys/{keyId}":{"delete":{"responses":{"204":{"description":"<No Content>","headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"403":{"description":"The caller authenticates with an agent access token or an OAuth access token. Neither can list, create, or revoke API keys; a browser session or a Settings API key can.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentKeyManagementForbiddenEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["keys"],"operationId":"keys.revokeKey","parameters":[{"name":"keyId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Revokes an API key by id. A key the caller may not revoke receives 404, like a missing key. Revocation is irreversible and touches only that key: keys minted with it stay enabled until they are revoked by id.","summary":"Revoke API key"}},"/api/billing/state":{"get":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"balance":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cardOnFile":{"type":"boolean"},"lastPack":{"anyOf":[{"type":"string","enum":["25","100","500","2000"],"description":"Prepaid credit pack, named by its price in US dollars. Credits are $0.05 each, and larger packs add bonus credits."},{"type":"null"}]},"dailySearches":{"type":"null"},"freeGrant":{"type":"string","enum":["none"]}},"required":["balance","cardOnFile","lastPack","dailySearches","freeGrant"],"additionalProperties":false},{"type":"object","properties":{"balance":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cardOnFile":{"type":"boolean"},"lastPack":{"anyOf":[{"type":"string","enum":["25","100","500","2000"],"description":"Prepaid credit pack, named by its price in US dollars. Credits are $0.05 each, and larger packs add bonus credits."},{"type":"null"}]},"dailySearches":{"type":"object","properties":{"limit":{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0},"remaining":{"type":"integer","minimum":0,"maximum":9007199254740991},"resetAt":{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0}},"required":["limit","remaining","resetAt"],"additionalProperties":false},"freeGrant":{"type":"string","enum":["identified_daily"]}},"required":["balance","cardOnFile","lastPack","dailySearches","freeGrant"],"additionalProperties":false}]}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["billing"],"operationId":"billing.billingState","parameters":[],"description":"Returns the prepaid credit balance, the daily search grant, the last pack bought, and whether a card is on file. Starts no checkout and changes no payment setting.","summary":"Read billing state"}},"/api/creators/{profileId}/contact":{"post":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"bio":{"anyOf":[{"type":"string"},{"type":"null"}]},"emails":{"type":"array","items":{"type":"string","format":"email"},"minItems":1}},"required":["bio","emails"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"402":{"description":"An unsigned caller has used its daily grant, or an identified caller needs credits that the daily grant does not cover and the prepaid balance holds fewer, or a payment credential on the request did not settle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutOfCreditsEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"404":{"description":"The creator profile exists, but Starcovery has no contact address for it, and `reason` reads `no_contact`. Nothing was charged. | A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/NoContactEncoded"},{"$ref":"#/components/schemas/NotFoundEncoded"}]}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["contact"],"operationId":"contact.revealContact","parameters":[{"name":"profileId","in":"path","schema":{"type":"string","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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$","format":"uuid"},"required":true}],"description":"Reveals the contact address of one creator profile. Spends 5 prepaid credits the first time this organization reveals that profile, and returns the address without charging on every later call. Search, MCP, and the CLI leave the address empty until this succeeds. A profile with no address on file answers 404 `not_found` with `reason` `no_contact` and charges nothing; an unknown profile answers 404 `not_found` with no `reason`. A prepaid balance under 5 credits answers 402 `out_of_credits` with no Payment challenge.","summary":"Reveal creator contact"}},"/api/profile-claims":{"post":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"claims":{"type":"array","items":{"type":"object","properties":{"expiresAt":{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},"handle":{"type":"string"},"id":{"type":"string"},"organizationId":{"type":"string"},"platform":{"type":"string","enum":["ig","tt"]},"status":{"type":"string","enum":["approved","expired","in_review","rejected","revoked"]},"verificationCode":{"type":"string","minLength":1}},"required":["expiresAt","handle","id","organizationId","platform","status"],"additionalProperties":false}},"organization":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string","minLength":1}},"required":["id","name"],"additionalProperties":false}},"required":["claims","organization"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"403":{"description":"The caller is not a member of the organization the request names, or an API key names an organization other than its own.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"404":{"description":"No creator profile matches a handle in the request, and `platform` names the platform of that handle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandleNotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"409":{"description":"Another organization has a claim in review on the profile. | Another organization holds an approved claim on the profile.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/InFlightEncoded"},{"$ref":"#/components/schemas/TakenEncoded"}]}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"410":{"description":"A takedown covers the profile, so no organization can claim it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TakenDownEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["profileClaims"],"operationId":"profileClaims.startProfileClaims","parameters":[],"description":"Starts a handle claim on an Instagram handle, a TikTok handle, or both, for an organization the caller belongs to. For each returned claim in review, Starcovery mails the calling user the verification code and the claim link, and sends the same mail at most once in 24 hours. A pre-claim agent token gets no mail and reads the code from the returned claim. Returns the organization and one claim per requested handle, new or already held by the organization. An API key may claim only for its own organization. An organization may hold 25 claims in review at a time, and 3 while the caller is a pre-claim agent token; a start that would pass that number gets 429 with `retry-after` set to the seconds until the organization's earliest claim in review expires, and starts no claim. For a pre-claim agent token that 429 also carries `reason` `claim_required` and an `error_description`, because a person who claims the agent identity raises the number to 25. A handle that a takedown covers gets 410 with error `taken_down`, and starts no claim.","summary":"Start handle claims","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"handles":{"type":"object","properties":{"ig":{"type":"string","minLength":1,"maxLength":31},"tt":{"type":"string","minLength":1,"maxLength":31}},"additionalProperties":false},"organizationId":{"type":"string","minLength":1}},"required":["handles"],"additionalProperties":false}}},"required":true}}},"/api/profile-claims/verify":{"post":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"claim":{"type":"object","properties":{"expiresAt":{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},"handle":{"type":"string"},"id":{"type":"string"},"organizationId":{"type":"string"},"platform":{"type":"string","enum":["ig","tt"]},"status":{"type":"string","enum":["approved","expired","in_review","rejected","revoked"]},"verificationCode":{"type":"string","minLength":1}},"required":["expiresAt","handle","id","organizationId","platform","status"],"additionalProperties":false}},"required":["claim"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["profileClaims"],"operationId":"profileClaims.verifyProfileClaim","parameters":[],"description":"Reads one handle claim of the caller by claim id and returns its state. Staff approve a claim by hand after the creator sends the verification code by direct message from the claimed profile. A claim of an organization the caller does not belong to receives 404, like a claim id no claim has.","summary":"Read handle claim","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"claimId":{"type":"string","minLength":1}},"required":["claimId"],"additionalProperties":false}}},"required":true}}},"/api/search":{"get":{"responses":{"200":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}},"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"creators":{"type":"array","items":{"type":"object","properties":{"averageViews":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Mean views of the creator's 6 newest posts with a stored video, counting the posts that have views. Null when none of them has views."},"bio":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"anyOf":[{"type":"string"},{"type":"null"}]},"emails":{"type":"array","items":{"type":"string","format":"email"},"description":"Contact addresses for this organization after Reveal contact. Empty until then.","default":[]},"engagementOnViews":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Mean of likes plus comments per view over the same posts as averageViews. Null when none of them has views."},"externalUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"fitScore":{"type":"number","minimum":0,"maximum":1},"followerCount":{"type":"integer","allOf":[{"minimum":-9007199254740991,"maximum":9007199254740991},{"minimum":-2147483648,"maximum":2147483647}],"minimum":1000},"hasContact":{"type":"boolean","description":"True when a contact address exists. The address is omitted until this organization reveals it.","default":false},"id":{"type":"string","minLength":1},"isVerified":{"type":"boolean"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"platform":{"type":"string","enum":["ig","tt"]},"profileImageUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"tier":{"type":"string","enum":["nano","micro","mid","macro","mega"]},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"videos":{"type":"array","items":{"type":"object","properties":{"bunnyStreamId":{"anyOf":[{"type":"string"},{"type":"null"}]},"bunnyThumbnailFile":{"anyOf":[{"type":"string"},{"type":"null"}]},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Video caption, truncated to the first 500 characters."},"commentCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"id":{"type":"string","minLength":1},"isAd":{"type":"boolean"},"isSponsored":{"type":"boolean"},"likeCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"playCount":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"playUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Signed video URL. It expires within 24 hours. Search again for a new URL."},"postedAt":{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},"score":{"type":"number"},"thumbnailUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Signed thumbnail URL. It expires within 24 hours. Search again for a new URL."},"webUrl":{"type":"string","format":"uri"}},"required":["bunnyStreamId","caption","commentCount","id","isAd","isSponsored","likeCount","playCount","playUrl","postedAt","score","thumbnailUrl","webUrl"],"additionalProperties":false}}},"required":["averageViews","bio","country","engagementOnViews","fitScore","followerCount","id","isVerified","name","platform","profileImageUrl","tier","username","videos"],"additionalProperties":false}},"query":{"type":"object","properties":{"country":{"anyOf":[{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},{"type":"string","enum":[""]}]},"platform":{"anyOf":[{"type":"string","description":"Instagram (ig) or TikTok (tt), in either letter case","allOf":[{"enum":["ig","tt"]}]},{"type":"string","enum":[""]}]},"q":{"type":"string","description":"Natural-language creator brief"},"tier":{"anyOf":[{"type":"string","description":"Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one.","allOf":[{"enum":["nano","micro","mid","macro","mega","nano+","micro+","mid+","macro+","micro-","mid-","macro-"]}]},{"type":"string","enum":[""]}]}},"required":["q"],"additionalProperties":false},"ticket":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single-use shortlist enrichment ticket for POST /api/search/enrich, bound to the search caller. Null when the shortlist is empty or holds more than 100 creators, or when an unsigned caller has no client IP. Absent on the first NDJSON line of a streamed search."}},"required":["creators","query"],"additionalProperties":false}},"application/x-ndjson; charset=utf-8":{"schema":{"type":"string","format":"binary"},"x-effect-stream":{"encoding":"uint8array"}}}},"400":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}},"description":"The query string does not decode against the operation's query schema, and `message` names the failure: the rule the value fails and, for a parameter, the path of the parameter on its own line, such as `at [\"platform\"]`. The api ignores an undeclared query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidQueryEncoded"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"402":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"description":"The seconds until the daily grant resets, sent when the grant is used.","required":false,"schema":{"type":"integer"}}},"description":"An unsigned caller has used its daily grant, or an identified caller needs credits that the daily grant does not cover and the prepaid balance holds fewer, or a payment credential on the request did not settle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutOfCreditsEncoded"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}},"503":{"headers":{"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true},"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}},"description":"Search is temporarily unavailable because the query embedding service is down. The failed search spends nothing; retry after the number of seconds in the `retry-after` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchUnavailableEncoded"}}}}},"security":[{},{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["search"],"operationId":"search.searchCreators","parameters":[{"name":"country","in":"query","schema":{"anyOf":[{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},{"type":"string","enum":[""]}]},"required":false},{"name":"platform","in":"query","schema":{"anyOf":[{"type":"string","description":"Instagram (ig) or TikTok (tt), in either letter case","allOf":[{"enum":["ig","tt"]}]},{"type":"string","enum":[""]}]},"required":false},{"name":"q","in":"query","schema":{"type":"string","description":"Natural-language creator brief","maxLength":200,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$"},"required":true},{"name":"tier","in":"query","schema":{"anyOf":[{"type":"string","description":"Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one.","allOf":[{"enum":["nano","micro","mid","macro","mega","nano+","micro+","mid+","macro+","micro-","mid-","macro-"]}]},{"type":"string","enum":[""]}]},"required":false},{"name":"force_payment","in":"query","schema":{"type":"string","description":"Set to 1 to mint the 402 paywall body without searching."},"required":false},{"name":"stream","in":"query","schema":{"type":"string","description":"Set to 1 for an NDJSON stream: first page, then the shortlist."},"required":false}],"description":"Ranks Instagram and TikTok creators against a brief. The filters come from the `platform`, `tier`, and `country` parameters alone, and `country` takes one or more country codes, comma separated, such as `us,ca`, for creators in any of them: a brief whose words name a platform, a country, or a follower count runs with no filter when the request sends none, so its creators span both platforms and every country, and `POST /api/search/parse` reads those filters out of the brief for the caller to send. Each creator includes a fit score, follower count, platform, and recent videos, and contact addresses stay empty until `POST /api/creators/{profileId}/contact`. A shortlist may include a `ticket` for `POST /api/search/enrich`. Holds the request open until the result, up to 800 seconds.\n\nTakes a credential or none. Each search is one use of the daily allowance a thread turn also draws on. An unsigned caller gets 100 uses per rolling 24 hours per client IP; an identified caller gets 200 per rolling 24 hours, the members of one organization share at most 200 between them, and past either it spends prepaid credits, and a pre-claim agent token spends prepaid credits only. A repeat of a brief and filters spends nothing when the organization already searched them and that search is still in its search history, or, for an unsigned caller, within 24 hours of the first search of them from the same IP. A used grant with no prepaid credits answers 402 `out_of_credits`. While the query embedding service is down, a search answers 503 `search_unavailable` with `retry-after`, spends nothing, and can be sent again then.","summary":"Search creators"}},"/api/search/enrich":{"post":{"responses":{"200":{"description":"Success","content":{"application/x-ndjson; charset=utf-8":{"schema":{"type":"string","format":"binary"},"x-effect-stream":{"encoding":"uint8array"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON. | The enrich ticket does not verify, has expired, was already used, or does not match the brief, the caller, or the creators in the request.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/InvalidBodyEncoded"},{"$ref":"#/components/schemas/InvalidTicketEncoded"}]}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{},{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["search"],"operationId":"search.enrichShortlist","parameters":[],"description":"Streams niche, celebrity, evidence, and signal analysis for a shortlist as NDJSON. Spends no credits. Holds the request open until the analysis ends, up to 800 seconds.\n\nSend the `creators` array from `GET /api/search`, the same brief as `query`, and the `ticket` from that response. The ticket is single-use and bound to the search caller.\n\nCounts against the limit thread turns share, 50 per 60 seconds per user, or per client IP for an unsigned caller; past it, it answers 429 with `retry-after` and leaves the ticket unspent.","summary":"Enrich shortlist","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"creators":{"type":"array","items":{"type":"object","properties":{"averageViews":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Mean views of the creator's 6 newest posts with a stored video, counting the posts that have views. Null when none of them has views."},"bio":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"anyOf":[{"type":"string"},{"type":"null"}]},"emails":{"type":"array","items":{"type":"string","format":"email"},"description":"Contact addresses for this organization after Reveal contact. Empty until then.","default":[]},"engagementOnViews":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Mean of likes plus comments per view over the same posts as averageViews. Null when none of them has views."},"externalUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"fitScore":{"type":"number","minimum":0,"maximum":1},"followerCount":{"type":"integer","allOf":[{"minimum":-9007199254740991,"maximum":9007199254740991},{"minimum":-2147483648,"maximum":2147483647}],"minimum":1000},"hasContact":{"type":"boolean","description":"True when a contact address exists. The address is omitted until this organization reveals it.","default":false},"id":{"type":"string","minLength":1},"isVerified":{"type":"boolean"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"platform":{"type":"string","enum":["ig","tt"]},"profileImageUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"tier":{"type":"string","enum":["nano","micro","mid","macro","mega"]},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"videos":{"type":"array","items":{"type":"object","properties":{"bunnyStreamId":{"anyOf":[{"type":"string"},{"type":"null"}]},"bunnyThumbnailFile":{"anyOf":[{"type":"string"},{"type":"null"}]},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Video caption, truncated to the first 500 characters."},"commentCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"id":{"type":"string","minLength":1},"isAd":{"type":"boolean"},"isSponsored":{"type":"boolean"},"likeCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"playCount":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"playUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Signed video URL. It expires within 24 hours. Search again for a new URL."},"postedAt":{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},"score":{"type":"number"},"thumbnailUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Signed thumbnail URL. It expires within 24 hours. Search again for a new URL."},"webUrl":{"type":"string","format":"uri"}},"required":["bunnyStreamId","caption","commentCount","id","isAd","isSponsored","likeCount","playCount","playUrl","postedAt","score","thumbnailUrl","webUrl"],"additionalProperties":false}}},"required":["bio","country","fitScore","followerCount","id","isVerified","name","platform","profileImageUrl","tier","username","videos"],"additionalProperties":false},"minItems":1,"maxItems":100},"query":{"type":"string","maxLength":200,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$","description":"The query of the search that minted the ticket, exactly as that search returned it"},"ticket":{"type":"string","minLength":1,"maxLength":32768}},"required":["creators","query","ticket"],"additionalProperties":false}}},"required":true}}},"/api/search/parse":{"post":{"responses":{"200":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}},"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"completion":{"anyOf":[{"type":"string"},{"type":"null"}]},"filters":{"type":"object","properties":{"country":{"anyOf":[{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},{"type":"null"}]},"platform":{"anyOf":[{"type":"string","description":"Instagram (ig) or TikTok (tt), in either letter case","allOf":[{"enum":["ig","tt"]}]},{"type":"null"}]},"spans":{"type":"array","items":{"type":"object","properties":{"end":{"type":"integer","minimum":0,"maximum":9007199254740991},"kind":{"type":"string","enum":["country","platform","tier"]},"start":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["end","kind","start"],"additionalProperties":false}},"tier":{"anyOf":[{"type":"string","description":"Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one.","allOf":[{"enum":["nano","micro","mid","macro","mega","nano+","micro+","mid+","macro+","micro-","mid-","macro-"]}]},{"type":"null"}]}},"required":["country","platform","spans","tier"],"additionalProperties":false}},"required":["completion","filters"],"additionalProperties":false}}}},"400":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}},"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[],"tags":["search"],"operationId":"search.parseSearchQuery","parameters":[],"description":"Reads the platform, tier, and country filters out of a brief and returns them with a completion of the brief, the country as every creator country the brief names, comma separated, such as `ca,us`, for the caller to send as the `platform`, `tier`, and `country` parameters of `GET /api/search`, which reads no filter from the words of a brief on its own. Takes no credential, and warms search for the brief so a `GET /api/search` that follows starts warm. Allows 50 requests per 60 seconds per client IP; past that it answers 429 with `retry-after`.","summary":"Parse brief filters","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"q":{"type":"string","maxLength":200,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$"}},"required":["q"],"additionalProperties":false}}},"required":true}}},"/api/videos/lookup":{"get":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"video":{"anyOf":[{"type":"object","properties":{"captionSha256":{"anyOf":[{"type":"string","pattern":"^[0-9a-f]{64}$"},{"type":"null"}],"description":"SHA-256, in lowercase hex, of the UTF-8 caption after Unicode NFC normalization, every run of whitespace collapsed to one space, and both ends trimmed. Null when the video has no caption."},"creatorAccountId":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"The platform's account ID of the creator who posted the video. Null when the catalog does not know the poster."},"durationMs":{"type":"integer","maximum":9007199254740991,"exclusiveMinimum":0,"description":"Video duration in milliseconds."},"platform":{"type":"string","enum":["ig","tt"]},"soundId":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"The platform's ID of the sound the video uses. Null when the catalog holds no sound for it."},"videoId":{"type":"string","minLength":1,"description":"The platform video ID: the shortcode on Instagram, the numeric video ID on TikTok."},"webUrl":{"type":"string","format":"uri","description":"Canonical URL of the video."}},"required":["captionSha256","creatorAccountId","durationMs","platform","soundId","videoId","webUrl"],"additionalProperties":false},{"type":"null"}],"description":"The catalog record of the video at the URL. Null when the catalog does not hold it."}},"required":["video"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The query string does not decode against the operation's query schema, and `message` names the failure: the rule the value fails and, for a parameter, the path of the parameter on its own line, such as `at [\"platform\"]`. The api ignores an undeclared query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidQueryEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["videos"],"operationId":"videos.lookupVideo","parameters":[{"name":"url","in":"query","schema":{"type":"string","description":"URL of the video: an Instagram post or reel (/p/, /reel/, /reels/, or /tv/ followed by the shortcode), or a TikTok video (/@<handle>/video/<id>). Query parameters are ignored.","format":"uri"},"required":true}],"description":"Answers whether the Starcovery catalog holds the Instagram or TikTok video at a URL, and when it does, describes it: the duration, a SHA-256 of the normalized caption, the account ID of the creator who posted it, and the sound ID. `video` is null when the catalog does not hold the video or a takedown removed it. Spends no credits and draws on no daily grant.","summary":"Look up a video"}},"/api/campaigns":{"get":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"campaigns":{"type":"array","items":{"type":"object","properties":{"goal":{"type":"string"},"id":{"type":"string","minLength":1},"matchCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"name":{"type":"string"},"nextStep":{"anyOf":[{"type":"object","properties":{"actor":{"anyOf":[{"type":"string","enum":["you","starcovery","creators"]},{"type":"object","properties":{"creator":{"type":"string"}},"required":["creator"],"additionalProperties":false}],"description":"Who takes the step: you (the organization that owns the campaign), starcovery, creators, or {\"creator\": \"<name>\"} when one funded creator has yet to post."},"id":{"type":"string","enum":["pick","proposal","send","answers","fund","post","payout"],"description":"The step, in campaign order: pick, proposal, send, answers, fund, post, payout."},"label":{"type":"string","description":"The step name the web app shows, such as \"Fund the creators who accepted\"."},"line":{"type":"string","description":"The sentence the web app shows for the step, such as \"Maria accepted. Fund $300 to lock them in.\""}},"required":["actor","id","label","line"],"additionalProperties":false},{"type":"null"}],"description":"The next step of the campaign and who takes it. Null once no step is left: the campaign is done or archived, or no creator was reached or accepted."},"status":{"type":"string","enum":["active","archived","draft"],"description":"Campaign status"},"updatedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"visibility":{"type":"string","enum":["private","public"],"description":"Who opens the campaign once its proposals are sent. Public is free. Private costs 1 credit. Before the send, only the organization opens the campaign, whatever the visibility."}},"required":["goal","id","matchCount","name","nextStep","status","updatedAt","visibility"],"additionalProperties":false}}},"required":["campaigns"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The query string does not decode against the operation's query schema, and `message` names the failure: the rule the value fails and, for a parameter, the path of the parameter on its own line, such as `at [\"platform\"]`. The api ignores an undeclared query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidQueryEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.listCampaigns","parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["active","archived","draft"],"description":"Lists only the campaigns in this status: draft, active, or archived. Omit it to list every campaign."},"required":false}],"description":"Lists the campaigns of the organization with goal, status, visibility, match count, and next step, newest update first.\n\n`status` lists only the campaigns in that status, `draft`, `active`, or `archived`; another value answers 400 `invalid_query`.\n\n`nextStep` is the step the web app shows next for the campaign: its `id`, its `label`, the `actor` who takes it (`you` for the organization, `starcovery`, `creators`, or `{\"creator\": \"<name>\"}`), and the `line` that says what it waits on. It is null once no step is left: the campaign is done or archived, or no creator was reached or accepted.","summary":"List campaigns"},"post":{"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"campaign":{"type":"object","properties":{"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"createdBy":{"type":"string","enum":["agent","human"]},"goal":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"organizationId":{"type":"string"},"status":{"type":"string","enum":["active","archived","draft"]},"updatedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"userId":{"anyOf":[{"type":"string"},{"type":"null"}]},"visibility":{"type":"string","enum":["private","public"]}},"required":["createdAt","createdBy","goal","id","name","organizationId","status","updatedAt","userId","visibility"],"additionalProperties":false}},"required":["campaign"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON. | The contract or the declassifying date fails the terms check: the declassifying date or the creator posting date is not the start of a UTC calendar day, a declassifying date comes without a contract or saved contract, the declassifying date or the creator posting date is before today in UTC or more than 5 years after it, or the compensation is not a whole dollar amount from $1 to $21,474,836, and `message` names the failure.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/InvalidBodyEncoded"},{"$ref":"#/components/schemas/InvalidCampaignTermsEncoded"}]}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"402":{"description":"An unsigned caller has used its daily grant, or an identified caller needs credits that the daily grant does not cover and the prepaid balance holds fewer, or a payment credential on the request did not settle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutOfCreditsEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.createCampaign","parameters":[],"description":"Creates a campaign from a goal. Until its proposals are sent, a campaign opens only to its organization and nothing is charged for that. A campaign is public and free by default, which opens it to anyone signed in once sent, and `visibility: \"private\"` spends 1 credit and keeps it to the organization after the send. Accepts the contract, the declassifying date, the disclosure, and the market information answer on create. A contract or date that fails the terms check, or a declassifying date without a contract, answers 400 `invalid_campaign_terms` with the reason in `message`.","summary":"Create campaign","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"contract":{"type":"object","properties":{"compensationCents":{"type":"integer","minimum":0,"maximum":9007199254740991},"creatorPostingDate":{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$","description":"Creator posting date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused. Omit when unset."},"deliverable":{"type":"string","maxLength":2000,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$"},"platforms":{"type":"array","items":{"type":"string","enum":["ig","tt"]},"minItems":1,"maxItems":2,"description":"Platforms the creator posts on for the one payment: ig for Instagram, tt for TikTok. A creator posts on each one they run."}},"required":["compensationCents","deliverable","platforms"],"additionalProperties":false,"description":"Compensation in USD cents, the paid deliverable, the platforms the creator posts on, and optional creator posting date."},"disclosure":{"type":"object","properties":{"statement":{"type":"string","maxLength":4000,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$"}},"required":["statement"],"additionalProperties":false,"description":"Paid partnership disclosure. Required before send."},"embargoUntil":{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$","description":"Campaign details declassifying date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused. It needs a contract in the same request. Omit when unset."},"goal":{"type":"string","description":"Campaign goal","maxLength":200,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$"},"idempotencyKey":{"type":"string","minLength":1,"maxLength":128,"description":"Client-generated key. A valid repeat with the same key answers with the campaign the first call created, even when its other fields differ."},"marketInformation":{"type":"object","properties":{"releaseDelayMonths":{"anyOf":[{"type":"integer","minimum":0,"maximum":18},{"type":"null"}]}},"required":["releaseDelayMonths"],"additionalProperties":false,"description":"When the campaign's name and pay per creator may join the going rate, the list of campaigns and the typical pay other organizations and creators see, which sets the platform fee: releaseDelayMonths 0 to 18 holds them back that many months after the first funding request since the campaign last held no funds for a fee of that many percent of the creator pool, and a releaseDelayMonths of null keeps them out for a 20 percent fee. A campaign joins no earlier than its declassifying date."},"name":{"type":"string","description":"Campaign name","maxLength":100,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$"},"visibility":{"type":"string","enum":["private","public"],"description":"Defaults to public, which opens the campaign to anyone signed in once its proposals are sent. Private costs 1 credit and keeps it to the organization after the send. Before the send, only the organization opens it either way."}},"required":["goal","name"],"additionalProperties":false}}},"required":true}}},"/api/campaigns/{campaignId}":{"get":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"contract":{"anyOf":[{"type":"object","properties":{"compensationCents":{"type":"integer","minimum":0,"maximum":9007199254740991},"creatorPostingDate":{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$","description":"Creator posting date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused. Omit when unset."},"deliverable":{"type":"string"},"platforms":{"type":"array","items":{"type":"string","enum":["ig","tt"]},"minItems":1,"maxItems":2,"description":"Platforms the creator posts on for the one payment: ig for Instagram, tt for TikTok. A creator posts on each one they run."}},"required":["compensationCents","deliverable","platforms"],"additionalProperties":false},{"type":"null"}],"description":"Structured contract metadata. Present for stakeholder and purchased access; null on open and summary."},"disclosure":{"anyOf":[{"type":"object","properties":{"capturedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"statement":{"type":"string"}},"required":["capturedAt","statement"],"additionalProperties":false},{"type":"null"}],"description":"Latest paid-partnership disclosure. Present for stakeholder and purchased access; null on open and summary. Required before send."},"embargoUntil":{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},{"type":"null"}],"description":"Campaign details declassifying date. Present for stakeholder and purchased access, and on the free summary after that date. Null when unset."},"marketInformation":{"anyOf":[{"type":"object","properties":{"releaseDelayMonths":{"anyOf":[{"type":"integer","minimum":0,"maximum":18},{"type":"null"}]}},"required":["releaseDelayMonths"],"additionalProperties":false},{"type":"null"}],"description":"When the campaign's name and pay per creator may join the going rate, the list of campaigns and the typical pay other organizations and creators see, which sets the platform fee: releaseDelayMonths 0 to 18 holds them back that many months after the first funding request since the campaign last held no funds for a fee of that many percent of the creator pool, and a releaseDelayMonths of null keeps them out for a 20 percent fee. A campaign joins no earlier than its declassifying date. Stakeholder-only. Null when unset."},"access":{"type":"string","enum":["open","purchased","stakeholder","summary"],"description":"open is an ordinary public body. stakeholder and purchased include contract. summary is the free body after the campaign details declassifying date, without contract."},"campaign":{"type":"object","properties":{"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"createdBy":{"type":"string","enum":["agent","human"]},"goal":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"organizationId":{"type":"string"},"status":{"type":"string","enum":["active","archived","draft"]},"updatedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"userId":{"anyOf":[{"type":"string"},{"type":"null"}]},"visibility":{"type":"string","enum":["private","public"]}},"required":["createdAt","createdBy","goal","id","name","organizationId","status","updatedAt","userId","visibility"],"additionalProperties":false},"matches":{"type":"array","items":{"type":"object","properties":{"addedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"campaignId":{"type":"string"},"fitScore":{"anyOf":[{"type":"number","minimum":0,"maximum":1},{"type":"null"}]},"followerCount":{"type":"integer","allOf":[{"minimum":-9007199254740991,"maximum":9007199254740991},{"minimum":-2147483648,"maximum":2147483647}],"minimum":1000},"handle":{"type":"string"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"platform":{"type":"string","enum":["ig","tt"]},"profileId":{"type":"string"},"profileImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"source":{"type":"string","enum":["generated","manual"]}},"required":["addedAt","campaignId","fitScore","followerCount","handle","id","name","platform","profileId","profileImageUrl","source"],"additionalProperties":false}},"currentSteps":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"actor":{"anyOf":[{"type":"string","enum":["you","starcovery","creators"]},{"type":"object","properties":{"creator":{"type":"string"}},"required":["creator"],"additionalProperties":false}],"description":"Who takes the step: you (the organization that owns the campaign), starcovery, creators, or {\"creator\": \"<name>\"} when one funded creator has yet to post."},"id":{"type":"string","enum":["pick","proposal","send","answers","fund","post","payout"],"description":"The step, in campaign order: pick, proposal, send, answers, fund, post, payout."},"label":{"type":"string","description":"The step name the web app shows, such as \"Fund the creators who accepted\"."},"line":{"type":"string","description":"The sentence the web app shows for the step, such as \"Maria accepted. Fund $300 to lock them in.\""}},"required":["actor","id","label","line"],"additionalProperties":false}},{"type":"null"}],"description":"Every step under way, in campaign order: each step the organization can take now or that waits on someone, with who takes it and its line. nextStep is one of them, so a step before nextStep can still wait, such as a proposal Starcovery has not sent. Stakeholder-only; null for other callers. Empty once no step is left."},"nextStep":{"anyOf":[{"type":"object","properties":{"actor":{"anyOf":[{"type":"string","enum":["you","starcovery","creators"]},{"type":"object","properties":{"creator":{"type":"string"}},"required":["creator"],"additionalProperties":false}],"description":"Who takes the step: you (the organization that owns the campaign), starcovery, creators, or {\"creator\": \"<name>\"} when one funded creator has yet to post."},"id":{"type":"string","enum":["pick","proposal","send","answers","fund","post","payout"],"description":"The step, in campaign order: pick, proposal, send, answers, fund, post, payout."},"label":{"type":"string","description":"The step name the web app shows, such as \"Fund the creators who accepted\"."},"line":{"type":"string","description":"The sentence the web app shows for the step, such as \"Maria accepted. Fund $300 to lock them in.\""}},"required":["actor","id","label","line"],"additionalProperties":false},{"type":"null"}],"description":"The next step of the campaign and who takes it. Stakeholder-only; null for other callers. Null once no step is left: the campaign is done or archived, or no creator was reached or accepted."},"people":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"answer":{"anyOf":[{"type":"string","enum":["accepted","declined"]},{"type":"null"}],"description":"The creator's answer to the proposal. Null until Starcovery records one."},"funding":{"anyOf":[{"type":"string","enum":["funded","requested"]},{"type":"null"}],"description":"requested while an open funding request covers this person, funded once Starcovery records the reserve, and null when no funding request covers them."},"handles":{"type":"array","items":{"type":"object","properties":{"handle":{"type":"string"},"platform":{"type":"string","enum":["ig","tt"]}},"required":["handle","platform"],"additionalProperties":false},"description":"The person's profiles on this campaign. Empty for a hire listed as its own entry, such as one that matches no creator on the campaign."},"hire":{"anyOf":[{"type":"object","properties":{"organizationName":{"type":"string"},"paidAt":{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},{"type":"null"}],"description":"When Starcovery paid the payout. Null while the payout is pending or unrecorded."},"payoutCents":{"anyOf":[{"type":"integer","allOf":[{"minimum":-9007199254740991,"maximum":9007199254740991},{"minimum":-2147483648,"maximum":2147483647}]},{"type":"null"}],"description":"The recorded payout. Null until Starcovery records one."},"posts":{"type":"array","items":{"type":"object","properties":{"engagementCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Likes plus comments on the post when Starcovery recorded its counts."},"platform":{"type":"string","enum":["ig","tt"]},"recordedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"url":{"type":"string","description":"The link to the live post."},"viewCount":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Views of the post when Starcovery recorded its counts."}},"required":["engagementCount","platform","recordedAt","url","viewCount"],"additionalProperties":false},"description":"Each live post Starcovery recorded for the hire, one per platform, with its link, views, and engagement. Empty until the creator posts."},"shortfallReason":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Why Starcovery recorded a payout below the contract compensation. Staff enter at most 280 characters. Null until a payout below the contract compensation is paid."},"signedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]}},"required":["organizationName","paidAt","payoutCents","posts","shortfallReason","signedAt"],"additionalProperties":false},{"type":"null"}],"description":"The signed hire of the creator organization that verified this person. Null when none exists."},"name":{"type":"string","description":"The creator name, else the handle, else the hired organization name."}},"required":["answer","funding","handles","hire","name"],"additionalProperties":false}},{"type":"null"}],"description":"Each person on the campaign, a creator's profiles rolled into one, with their answer, funding, hire, payout, and live posts; every signed hire appears once. Stakeholder-only; null for other callers."}},"required":["contract","disclosure","embargoUntil","marketInformation","access","campaign","matches","currentSteps","nextStep","people"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.openCampaign","parameters":[{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Returns one campaign with its matched creators. An ordinary public campaign is free to read for any identified caller. A private campaign reads as 404 for a caller outside the organization, and so does a public campaign before its declassifying date.\n\nFor a caller in the organization, `people` lists each person on the campaign once, with their profiles, their answer, their funding, and their signed hire with the payout amount, the paid date, and each live post Starcovery recorded with its link, views, and engagement, plus every other signed hire as its own entry, such as one that matches no creator on the campaign or a second hire on another profile of a person. `nextStep` names the step the web app shows next and who takes it, as `GET /api/campaigns` does, null once no step is left. `currentSteps` lists every step under way in campaign order in the same shape, so a send that still waits on Starcovery shows beside a later `nextStep`; it is empty once no step is left. All three are null for every other caller.","summary":"Open campaign"},"patch":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"campaign":{"type":"object","properties":{"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"createdBy":{"type":"string","enum":["agent","human"]},"goal":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"organizationId":{"type":"string"},"status":{"type":"string","enum":["active","archived","draft"]},"updatedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"userId":{"anyOf":[{"type":"string"},{"type":"null"}]},"visibility":{"type":"string","enum":["private","public"]}},"required":["createdAt","createdBy","goal","id","name","organizationId","status","updatedAt","userId","visibility"],"additionalProperties":false}},"required":["campaign"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON. | The contract or the declassifying date fails the terms check: the declassifying date or the creator posting date is not the start of a UTC calendar day, a declassifying date comes without a contract or saved contract, the declassifying date or the creator posting date is before today in UTC or more than 5 years after it, or the compensation is not a whole dollar amount from $1 to $21,474,836, and `message` names the failure.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/InvalidBodyEncoded"},{"$ref":"#/components/schemas/InvalidCampaignTermsEncoded"}]}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"402":{"description":"An unsigned caller has used its daily grant, or an identified caller needs credits that the daily grant does not cover and the prepaid balance holds fewer, or a payment credential on the request did not settle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutOfCreditsEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"409":{"description":"The status change would return a sent campaign to draft, set active on a campaign that was never sent, or drop an open request, and `reason` names which. | The request changes or clears the contract, or changes the disclosure statement, of a campaign whose proposals were sent: it is active or holds a delivery. | The request changes or clears the market information answer of a campaign that has a funding request open or holds funds.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CampaignStatusLockedEncoded"},{"$ref":"#/components/schemas/ContractLockedEncoded"},{"$ref":"#/components/schemas/MarketInformationLockedEncoded"}]}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.updateCampaign","parameters":[{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Updates the name, goal, visibility, status, contract, declassifying date, disclosure, or market information answer. An omitted field stays unchanged. Status takes draft, archived, or active; Starcovery sets active when the team sends the proposals, and active reopens an archived campaign whose proposals were sent. A campaign that is active or holds a delivery cannot return to draft, a campaign with an open send or funding request cannot be archived, and a campaign that is not archived or was never sent cannot be set active: each answers 409 `campaign_status_locked` with `reason` `sent`, `request_open`, or `not_sent`.\n\nA contract or date that fails the terms check, a declassifying date on a campaign with no saved contract, or a null `contract` on a campaign that keeps its declassifying date, answers 400 `invalid_campaign_terms` with the reason in `message`.\n\nThe contract and the disclosure lock when the team sends the proposals: while the campaign is active or holds a delivery, a contract change or clear, or a disclosure change, answers 409 `contract_locked`. Omit `contract` and `disclosure` to change the other fields of a sent campaign.\n\nThe market information answer locks while a funding request is open or the campaign holds funds, and unlocks once the reserve is refunded to zero: while it is locked, a change or a clear answers 409 `market_information_locked`.\n\nTurning a public campaign private spends 1 credit; an update of an already private campaign does not.","summary":"Update campaign","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"goal":{"type":"string","description":"Campaign goal","maxLength":200,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$"},"name":{"type":"string","description":"Campaign name","maxLength":100,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$"},"status":{"type":"string","enum":["active","archived","draft"],"description":"draft, archived, or active. Starcovery sets active when the team sends the proposals; active reopens an archived campaign whose proposals were sent."},"visibility":{"type":"string","enum":["private","public"],"description":"Who opens the campaign once its proposals are sent. Public is free. Private costs 1 credit. Before the send, only the organization opens the campaign, whatever the visibility."},"contract":{"anyOf":[{"type":"object","properties":{"compensationCents":{"type":"integer","minimum":0,"maximum":9007199254740991},"creatorPostingDate":{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$","description":"Creator posting date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused. Omit when unset."},"deliverable":{"type":"string","maxLength":2000,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$"},"platforms":{"type":"array","items":{"type":"string","enum":["ig","tt"]},"minItems":1,"maxItems":2,"description":"Platforms the creator posts on for the one payment: ig for Instagram, tt for TikTok. A creator posts on each one they run."}},"required":["compensationCents","deliverable","platforms"],"additionalProperties":false,"description":"Compensation in USD cents, the paid deliverable, the platforms the creator posts on, and optional creator posting date."},{"type":"null"}],"description":"Null clears stored contract metadata. A stored declassifying date needs a contract, so clear embargoUntil in the same patch."},"disclosure":{"type":"object","properties":{"statement":{"type":"string","maxLength":4000,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$"}},"required":["statement"],"additionalProperties":false,"description":"Paid partnership disclosure. Required before send."},"embargoUntil":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$","description":"Campaign details declassifying date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused."},{"type":"null"}],"description":"Campaign details declassifying date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused. Null clears it."},"marketInformation":{"anyOf":[{"type":"object","properties":{"releaseDelayMonths":{"anyOf":[{"type":"integer","minimum":0,"maximum":18},{"type":"null"}]}},"required":["releaseDelayMonths"],"additionalProperties":false},{"type":"null"}],"description":"When the campaign's name and pay per creator may join the going rate, the list of campaigns and the typical pay other organizations and creators see, which sets the platform fee: releaseDelayMonths 0 to 18 holds them back that many months after the first funding request since the campaign last held no funds for a fee of that many percent of the creator pool, and a releaseDelayMonths of null keeps them out for a 20 percent fee. A campaign joins no earlier than its declassifying date. Null clears the answer. While a funding request is open or the campaign holds funds, a change or a clear is refused."}},"additionalProperties":false,"minProperties":1}}},"required":true}},"delete":{"responses":{"204":{"description":"<No Content>","headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"409":{"description":"The campaign has funding on record, refunded funding included, or a signed hire on record. | A proposal delivery is on record for the match the request removes, or for any match of the campaign the request deletes. | The campaign fails a gate of the send or funding request, a request of the same kind is already open on the campaign, or a send request cancel found no open send request, and `reason` names which.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CampaignFundingActiveEncoded"},{"$ref":"#/components/schemas/CampaignMatchDeliveredEncoded"},{"$ref":"#/components/schemas/CampaignRequestDeniedEncoded"}]}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.deleteCampaign","parameters":[{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Deletes a campaign and its matches. A campaign with funding on record, refunded funding included, or with a signed hire answers 409 `campaign_funding_active`, a campaign with a proposal delivery on any match answers 409 `campaign_match_delivered`, an active campaign answers 409 `campaign_request_denied` with reason `already_sent`, and a campaign with an open send request answers 409 `campaign_request_denied` with reason `already_open`; an owner cancels that request with `POST /api/campaigns/{campaignId}/send/cancel` first.","summary":"Delete campaign"}},"/api/campaigns/{campaignId}/generate":{"post":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"contract":{"anyOf":[{"type":"object","properties":{"compensationCents":{"type":"integer","minimum":0,"maximum":9007199254740991},"creatorPostingDate":{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$","description":"Creator posting date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused. Omit when unset."},"deliverable":{"type":"string"},"platforms":{"type":"array","items":{"type":"string","enum":["ig","tt"]},"minItems":1,"maxItems":2,"description":"Platforms the creator posts on for the one payment: ig for Instagram, tt for TikTok. A creator posts on each one they run."}},"required":["compensationCents","deliverable","platforms"],"additionalProperties":false},{"type":"null"}],"description":"Structured contract metadata. Present for stakeholder and purchased access; null on open and summary."},"disclosure":{"anyOf":[{"type":"object","properties":{"capturedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"statement":{"type":"string"}},"required":["capturedAt","statement"],"additionalProperties":false},{"type":"null"}],"description":"Latest paid-partnership disclosure. Present for stakeholder and purchased access; null on open and summary. Required before send."},"embargoUntil":{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},{"type":"null"}],"description":"Campaign details declassifying date. Present for stakeholder and purchased access, and on the free summary after that date. Null when unset."},"marketInformation":{"anyOf":[{"type":"object","properties":{"releaseDelayMonths":{"anyOf":[{"type":"integer","minimum":0,"maximum":18},{"type":"null"}]}},"required":["releaseDelayMonths"],"additionalProperties":false},{"type":"null"}],"description":"When the campaign's name and pay per creator may join the going rate, the list of campaigns and the typical pay other organizations and creators see, which sets the platform fee: releaseDelayMonths 0 to 18 holds them back that many months after the first funding request since the campaign last held no funds for a fee of that many percent of the creator pool, and a releaseDelayMonths of null keeps them out for a 20 percent fee. A campaign joins no earlier than its declassifying date. Stakeholder-only. Null when unset."},"access":{"type":"string","enum":["open","purchased","stakeholder","summary"],"description":"open is an ordinary public body. stakeholder and purchased include contract. summary is the free body after the campaign details declassifying date, without contract."},"campaign":{"type":"object","properties":{"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"createdBy":{"type":"string","enum":["agent","human"]},"goal":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"organizationId":{"type":"string"},"status":{"type":"string","enum":["active","archived","draft"]},"updatedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"userId":{"anyOf":[{"type":"string"},{"type":"null"}]},"visibility":{"type":"string","enum":["private","public"]}},"required":["createdAt","createdBy","goal","id","name","organizationId","status","updatedAt","userId","visibility"],"additionalProperties":false},"matches":{"type":"array","items":{"type":"object","properties":{"addedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"campaignId":{"type":"string"},"fitScore":{"anyOf":[{"type":"number","minimum":0,"maximum":1},{"type":"null"}]},"followerCount":{"type":"integer","allOf":[{"minimum":-9007199254740991,"maximum":9007199254740991},{"minimum":-2147483648,"maximum":2147483647}],"minimum":1000},"handle":{"type":"string"},"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"platform":{"type":"string","enum":["ig","tt"]},"profileId":{"type":"string"},"profileImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"source":{"type":"string","enum":["generated","manual"]}},"required":["addedAt","campaignId","fitScore","followerCount","handle","id","name","platform","profileId","profileImageUrl","source"],"additionalProperties":false}},"generated":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"How many searched creators landed or refreshed as matches."}},"required":["contract","disclosure","embargoUntil","marketInformation","access","campaign","matches","generated"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"402":{"description":"An unsigned caller has used its daily grant, or an identified caller needs credits that the daily grant does not cover and the prepaid balance holds fewer, or a payment credential on the request did not settle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutOfCreditsEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"409":{"description":"The campaign fails a gate of the send or funding request, a request of the same kind is already open on the campaign, or a send request cancel found no open send request, and `reason` names which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRequestDeniedEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.generateCampaignMatches","parameters":[{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Runs one creator search from the campaign goal and saves the ranked creators as matches, idempotent on campaign and profile. Spends the same daily grant and prepaid credits as `GET /api/search`, and a pre-claim agent token spends prepaid credits only. Optional filters narrow that search, and `country` takes one or more country codes, comma separated, such as `us,ca`. Without filters, it reads them from the goal under the limit thread turns share, 50 per 60 seconds per user; past it, it answers 429 with `retry-after`. Holds the request open until the result, up to 800 seconds.\n\nA campaign with an open send request, a sent campaign, or an archived campaign answers 409 `campaign_request_denied` with reason `already_open`, `already_sent`, or `archived`, before any search runs.","summary":"Generate matches","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"country":{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},"platform":{"type":"string","description":"Instagram (ig) or TikTok (tt), in either letter case","allOf":[{"enum":["ig","tt"]}]},"tier":{"type":"string","description":"Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one.","allOf":[{"enum":["nano","micro","mid","macro","mega","nano+","micro+","mid+","macro+","micro-","mid-","macro-"]}]}},"additionalProperties":false}}},"required":true}}},"/api/campaigns/{campaignId}/matches":{"post":{"responses":{"204":{"description":"<No Content>","headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"409":{"description":"The campaign fails a gate of the send or funding request, a request of the same kind is already open on the campaign, or a send request cancel found no open send request, and `reason` names which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRequestDeniedEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.addCampaignMatch","parameters":[{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Adds one creator from a search result to the shortlist by hand. Idempotent on campaign and profile. The body carries `profileId` and `fitScore` and nothing else: the platform, handle, name, picture, and follower count of the match come from the catalog profile, and a body with any other key, `platform` or `username` included, answers 400 `invalid_body` naming the key. A `profileId` with no catalog profile receives 404.\n\nThe shortlist is fixed while a send request is open, once the campaign is sent, and while the campaign is archived: a match change then answers 409 `campaign_request_denied` with reason `already_open`, `already_sent`, or `archived`.","summary":"Add match","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"fitScore":{"anyOf":[{"type":"number","minimum":0,"maximum":1},{"type":"null"}]},"profileId":{"type":"string","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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$","format":"uuid"}},"required":["fitScore","profileId"],"additionalProperties":false}}},"required":true}}},"/api/campaigns/{campaignId}/matches/{matchId}":{"delete":{"responses":{"204":{"description":"<No Content>","headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"409":{"description":"A proposal delivery is on record for the match the request removes, or for any match of the campaign the request deletes. | The campaign fails a gate of the send or funding request, a request of the same kind is already open on the campaign, or a send request cancel found no open send request, and `reason` names which.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CampaignMatchDeliveredEncoded"},{"$ref":"#/components/schemas/CampaignRequestDeniedEncoded"}]}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.removeCampaignMatch","parameters":[{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true},{"name":"matchId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Removes one matched creator from the shortlist by id. A match that already has a proposal delivery answers 409 `campaign_match_delivered`. Any other match of a campaign with an open send request, a sent campaign, or an archived campaign answers 409 `campaign_request_denied` with reason `already_open`, `already_sent`, or `archived`.","summary":"Remove match"}},"/api/campaigns/{campaignId}/export":{"get":{"responses":{"200":{"headers":{"content-disposition":{"schema":{"type":"string"},"required":true},"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}},"description":"Success","content":{"text/csv; charset=utf-8":{"schema":{"type":"string"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.exportCampaign","parameters":[{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Exports the shortlist as CSV with the columns Rank, Handle, Name, Platform, Followers, Fit, and Source. Reads under the same access as `GET /api/campaigns/{campaignId}`.","summary":"Export shortlist CSV"}},"/api/campaigns/{campaignId}/send-request":{"post":{"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"request":{"anyOf":[{"type":"object","properties":{"campaignId":{"type":"string"},"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"id":{"type":"string"},"requestedBy":{"anyOf":[{"type":"string"},{"type":"null"}]},"resolvedAt":{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},{"type":"null"}]},"amountCents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"kind":{"type":"string","enum":["fund"]}},"required":["campaignId","createdAt","id","requestedBy","resolvedAt","amountCents","kind"],"additionalProperties":false},{"type":"object","properties":{"campaignId":{"type":"string"},"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"id":{"type":"string"},"requestedBy":{"anyOf":[{"type":"string"},{"type":"null"}]},"resolvedAt":{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},{"type":"null"}]},"amountCents":{"type":"null"},"kind":{"type":"string","enum":["send"]}},"required":["campaignId","createdAt","id","requestedBy","resolvedAt","amountCents","kind"],"additionalProperties":false}]}},"required":["request"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"409":{"description":"The campaign fails a gate of the send or funding request, a request of the same kind is already open on the campaign, or a send request cancel found no open send request, and `reason` names which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRequestDeniedEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.requestCampaignSend","parameters":[{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Records one open Send Proposal request and notifies the Starcovery team, who send the proposals from the staff queue. This call mails nothing. The campaign needs draft status, a contract whose creator posting date, when set, is today or a later day in UTC, a disclosure, and at least one match. A failed gate, or a request already open, answers 409 `campaign_request_denied` with the reason.","summary":"Request a proposal send"}},"/api/campaigns/{campaignId}/send/cancel":{"post":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"request":{"anyOf":[{"type":"object","properties":{"campaignId":{"type":"string"},"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"id":{"type":"string"},"requestedBy":{"anyOf":[{"type":"string"},{"type":"null"}]},"resolvedAt":{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},{"type":"null"}]},"amountCents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"kind":{"type":"string","enum":["fund"]}},"required":["campaignId","createdAt","id","requestedBy","resolvedAt","amountCents","kind"],"additionalProperties":false},{"type":"object","properties":{"campaignId":{"type":"string"},"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"id":{"type":"string"},"requestedBy":{"anyOf":[{"type":"string"},{"type":"null"}]},"resolvedAt":{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},{"type":"null"}]},"amountCents":{"type":"null"},"kind":{"type":"string","enum":["send"]}},"required":["campaignId","createdAt","id","requestedBy","resolvedAt","amountCents","kind"],"additionalProperties":false}]}},"required":["request"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"403":{"description":"The caller does not hold the owner role in the organization, which cancelling a send request requires.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendCancelForbiddenEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"409":{"description":"The campaign fails a gate of the send or funding request, a request of the same kind is already open on the campaign, or a send request cancel found no open send request, and `reason` names which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRequestDeniedEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.cancelCampaignSend","parameters":[{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Cancels the open Send Proposal request, so the Starcovery team does not send it. This call mails no one. The request closes with `resolvedAt` set to the cancel time, and Starcovery records who cancelled it. The campaign stays a draft, so its shortlist and terms can change, it can be deleted, and a new send request can open. Only an owner may call it; another member answers 403 `send_cancel_forbidden`. A campaign with no open send request answers 409 `campaign_request_denied` with reason `not_open`, or `already_sent` when the team already sent the proposals.","summary":"Cancel a proposal send request"}},"/api/campaigns/{campaignId}/funding-request":{"post":{"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"request":{"anyOf":[{"type":"object","properties":{"campaignId":{"type":"string"},"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"id":{"type":"string"},"requestedBy":{"anyOf":[{"type":"string"},{"type":"null"}]},"resolvedAt":{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},{"type":"null"}]},"amountCents":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"kind":{"type":"string","enum":["fund"]}},"required":["campaignId","createdAt","id","requestedBy","resolvedAt","amountCents","kind"],"additionalProperties":false},{"type":"object","properties":{"campaignId":{"type":"string"},"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"id":{"type":"string"},"requestedBy":{"anyOf":[{"type":"string"},{"type":"null"}]},"resolvedAt":{"anyOf":[{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},{"type":"null"}]},"amountCents":{"type":"null"},"kind":{"type":"string","enum":["send"]}},"required":["campaignId","createdAt","id","requestedBy","resolvedAt","amountCents","kind"],"additionalProperties":false}]}},"required":["request"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"403":{"description":"The caller does not hold the owner or admin role in the organization, which buying credits, opening the billing portal, and funding a campaign require.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationFundingForbiddenEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"409":{"description":"The campaign fails a gate of the send or funding request, a request of the same kind is already open on the campaign, or a send request cancel found no open send request, and `reason` names which.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRequestDeniedEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.requestCampaignFunding","parameters":[{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Records one open funding request for the accepted creators not yet funded, per person, and notifies the Starcovery team, who invoice the organization. The quoted total is the compensation per creator times those people, plus the platform fee that the market information answer sets. This call moves no money. Only an owner or admin may call it; another member answers 403 `organization_funding_forbidden`.\n\nAn archived campaign answers `archived`; reopen it with `PATCH /api/campaigns/{campaignId}` and `{\"status\":\"active\"}` first. The campaign needs a contract, a market information answer, and at least one creator who accepted and is not yet funded (`no_accepted` otherwise). A failed gate, or a request already open, answers 409 `campaign_request_denied`. The reason `creators_changed` means a creator accepted while the request was prepared, and the caller repeats the same call.","summary":"Request campaign funding"}},"/api/campaigns/{campaignId}/chat":{"get":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"attachments":{"type":"array","items":{"type":"object","properties":{"byteSize":{"type":"integer","allOf":[{"minimum":-9007199254740991,"maximum":9007199254740991},{"minimum":-2147483648,"maximum":2147483647}]},"campaignId":{"type":"string"},"contentType":{"type":"string"},"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"filename":{"type":"string"},"id":{"type":"string"},"pathname":{"type":"string"},"userId":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["byteSize","campaignId","contentType","createdAt","filename","id","pathname","userId"],"additionalProperties":false}},"campaign":{"type":"object","properties":{"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"createdBy":{"type":"string","enum":["agent","human"]},"goal":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"organizationId":{"type":"string"},"status":{"type":"string","enum":["active","archived","draft"]},"updatedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"userId":{"anyOf":[{"type":"string"},{"type":"null"}]},"visibility":{"type":"string","enum":["private","public"]}},"required":["createdAt","createdBy","goal","id","name","organizationId","status","updatedAt","userId","visibility"],"additionalProperties":false}},"required":["attachments","campaign"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.readCampaignChat","parameters":[{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Returns the campaign and its attachments. The response no longer has a `messages` field: the retired campaign chat it held is being deleted, and the assistant turn (`POST /api/threads/{threadId}/turns`) replaced that chat.","summary":"Read a campaign with its attachments"}},"/api/campaigns/{campaignId}/attachments":{"post":{"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"attachment":{"type":"object","properties":{"byteSize":{"type":"integer","allOf":[{"minimum":-9007199254740991,"maximum":9007199254740991},{"minimum":-2147483648,"maximum":2147483647}]},"campaignId":{"type":"string"},"contentType":{"type":"string"},"createdAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"}]},"filename":{"type":"string"},"id":{"type":"string"},"pathname":{"type":"string"},"userId":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["byteSize","campaignId","contentType","createdAt","filename","id","pathname","userId"],"additionalProperties":false}},"required":["attachment"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON. | The query string does not decode against the operation's query schema, and `message` names the failure: the rule the value fails and, for a parameter, the path of the parameter on its own line, such as `at [\"platform\"]`. The api ignores an undeclared query parameter. | The `content-type` of the upload, without its parameters, is not `application/json`, `application/pdf`, `image/gif`, `image/jpeg`, `image/png`, `image/webp`, `text/csv`, or `text/plain`.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/InvalidBodyEncoded"},{"$ref":"#/components/schemas/InvalidQueryEncoded"},{"$ref":"#/components/schemas/UnsupportedTypeEncoded"}]}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"409":{"description":"Storing the file would exceed an attachment quota: 50 files or 100 MiB per campaign, 250 files or 500 MiB per organization, or 100 files or 200 MiB per user in the organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotaExceededEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"413":{"description":"The uploaded file is larger than 4 MiB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TooLargeEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.uploadCampaignAttachment","parameters":[{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true},{"name":"filename","in":"query","schema":{"type":"string","minLength":1,"maxLength":255},"required":true}],"description":"Stores one attachment on a campaign. Send the file bytes as the request body with the file type as `content-type`, and the file name in the `filename` query parameter.\n\nAn empty body answers 400 `invalid_body`, a missing `filename` answers 400 `invalid_query`, a file over 4 MiB answers 413 `too_large`, an unsupported type answers 400 `unsupported_type`, and an upload over an attachment quota answers 409 `quota_exceeded`.\n\nAttachment quotas cap the file count and the total bytes: 50 files or 100 MiB per campaign, 250 files or 500 MiB per organization, and 100 files or 200 MiB per user in the organization; the 409 does not name the quota it reached. Allows 20 uploads per 60 seconds per user in the organization; past the limit it answers 429 with `retry-after`.","summary":"Upload attachment","requestBody":{"content":{"application/json":{"schema":{"format":"binary","type":"string"}},"application/pdf":{"schema":{"format":"binary","type":"string"}},"image/gif":{"schema":{"format":"binary","type":"string"}},"image/jpeg":{"schema":{"format":"binary","type":"string"}},"image/png":{"schema":{"format":"binary","type":"string"}},"image/webp":{"schema":{"format":"binary","type":"string"}},"text/csv":{"schema":{"format":"binary","type":"string"}},"text/plain":{"schema":{"format":"binary","type":"string"}}},"required":true}}},"/api/campaigns/{campaignId}/attachments/{attachmentId}":{"get":{"responses":{"200":{"headers":{"cache-control":{"schema":{"type":"string"},"required":true},"content-disposition":{"schema":{"type":"string"},"required":true},"content-length":{"schema":{"type":"string"},"required":true},"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}},"description":"Success","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"},"x-effect-stream":{"encoding":"uint8array"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.readCampaignAttachment","parameters":[{"name":"attachmentId","in":"path","schema":{"type":"string","minLength":1},"required":true},{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Streams the stored bytes of one campaign attachment.","summary":"Read attachment"},"delete":{"responses":{"204":{"description":"<No Content>","headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["campaigns"],"operationId":"campaigns.deleteCampaignAttachment","parameters":[{"name":"attachmentId","in":"path","schema":{"type":"string","minLength":1},"required":true},{"name":"campaignId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Deletes one campaign attachment.","summary":"Delete attachment"}},"/api/threads":{"post":{"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"activeRun":{"anyOf":[{"type":"string"},{"type":"null"}]},"brief":{"anyOf":[{"type":"string"},{"type":"null"}]},"filters":{"type":"object","properties":{"country":{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},"platform":{"type":"string","description":"Instagram (ig) or TikTok (tt), in either letter case","allOf":[{"enum":["ig","tt"]}]},"tier":{"type":"string","description":"Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one.","allOf":[{"enum":["nano","micro","mid","macro","mega","nano+","micro+","mid+","macro+","micro-","mid-","macro-"]}]}},"additionalProperties":false},"id":{"type":"string"},"turns":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"state":{"type":"string","enum":["running","stopping","committed","failed","stopped"]}},"required":["id","state"],"additionalProperties":false},"description":"The turns the thread admitted, oldest first: each run id and its state, `running` or `stopping` while it is open, then `committed`, `stopped`, or `failed`. A caller that lost the stream of a run finds that run here to learn whether it was admitted and how it ended; a run absent here has not been admitted."},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":128},"parts":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"providerMetadata":{"anyOf":[{"type":"object","properties":{"starcovery":{"anyOf":[{"type":"object","properties":{"line":{"type":"string","enum":["results"]}},"required":["line"],"additionalProperties":false},{"type":"null"}]}},"additionalProperties":false,"description":"Carries `{\"starcovery\":{\"line\":\"results\"}}` on the results line, the reply of a first brief or a pasted website address sent without `context` that has no other reply, so a caller tells that line from any other reply without reading its words. Any other provider metadata is dropped."},{"type":"null"}]},"text":{"type":"string"},"type":{"type":"string","enum":["text"]}},"required":["text","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"type":"object","properties":{"resultId":{"anyOf":[{"type":"string"},{"type":"null"}]},"spec":{"type":"object","properties":{"country":{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},"platform":{"type":"string","description":"Instagram (ig) or TikTok (tt), in either letter case","allOf":[{"enum":["ig","tt"]}]},"tier":{"type":"string","description":"Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one.","allOf":[{"enum":["nano","micro","mid","macro","mega","nano+","micro+","mid+","macro+","micro-","mid-","macro-"]}]},"exclusions":{"type":"array","items":{"type":"string","minLength":1,"maxLength":160,"description":"The creators, accounts, or posts to leave out, as a short noun phrase such as brand accounts"}},"individualCreators":{"type":"boolean","enum":[true],"description":"Present when the brief split read the niche words as asking for individual creators, indie creators, or real people"},"narrowings":{"type":"object","properties":{"maxAverageViews":{"type":"integer","minimum":0,"maximum":9007199254740991},"minAverageViews":{"type":"integer","minimum":0,"maximum":9007199254740991},"minEngagementOnViews":{"type":"number","minimum":0,"maximum":1},"top":{"type":"integer","minimum":1,"maximum":100},"verified":{"type":"boolean"}},"additionalProperties":false},"niche":{"type":"string"},"nicheExclusion":{"type":"string","minLength":1,"description":"The exclusion the brief split read inside the niche words, present only when the niche words leave something out"}},"required":["exclusions","narrowings","niche"],"additionalProperties":false}},"required":["spec"],"additionalProperties":false},"id":{"type":"string"},"type":{"type":"string","enum":["data-brief"]}},"required":["data","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"anyOf":[{"type":"object","properties":{"state":{"type":"string","enum":["pending"]},"action":{"type":"string","enum":["delete_campaign","delete_campaign_attachment","delete_list","remove_campaign_match","request_campaign_funding","request_campaign_send","revoke_api_key","update_campaign","fund_campaign","send_campaign"]},"id":{"type":"string","minLength":1},"input":{"type":"object"},"label":{"type":"string","minLength":1}},"required":["state","action","id","input","label"],"additionalProperties":false},{"type":"object","properties":{"state":{"type":"string","enum":["cancelled"]},"action":{"type":"string","enum":["delete_campaign","delete_campaign_attachment","delete_list","remove_campaign_match","request_campaign_funding","request_campaign_send","revoke_api_key","update_campaign","fund_campaign","send_campaign"]},"id":{"type":"string","minLength":1},"input":{"type":"object"},"label":{"type":"string","minLength":1}},"required":["state","action","id","input","label"],"additionalProperties":false},{"type":"object","properties":{"state":{"type":"string","enum":["confirmed"]},"action":{"type":"string","enum":["delete_campaign","delete_campaign_attachment","delete_list","remove_campaign_match","request_campaign_funding","request_campaign_send","revoke_api_key","update_campaign","fund_campaign","send_campaign"]},"id":{"type":"string","minLength":1},"input":{"type":"object"},"label":{"type":"string","minLength":1}},"required":["state","action","id","input","label"],"additionalProperties":false},{"type":"object","properties":{"denial":{"type":"string","minLength":1,"maxLength":300},"state":{"type":"string","enum":["failed"]},"action":{"type":"string","enum":["delete_campaign","delete_campaign_attachment","delete_list","remove_campaign_match","request_campaign_funding","request_campaign_send","revoke_api_key","update_campaign","fund_campaign","send_campaign"]},"id":{"type":"string","minLength":1},"input":{"type":"object"},"label":{"type":"string","minLength":1}},"required":["denial","state","action","id","input","label"],"additionalProperties":false}]},"id":{"type":"string"},"type":{"type":"string","enum":["data-confirm"]}},"required":["data","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"type":"object","properties":{"freeGrant":{"type":"string","enum":["identified_daily","none","unsigned_daily"]}},"required":["freeGrant"],"additionalProperties":false},"id":{"type":"string"},"type":{"type":"string","enum":["data-exhausted"]}},"required":["data","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"anyOf":[{"type":"object","properties":{"action":{"type":"object","properties":{"label":{"type":"string","minLength":1},"path":{"type":"string"}},"required":["label","path"],"additionalProperties":false},"campaignId":{"type":"string","minLength":1},"line":{"type":"string","minLength":1},"stepId":{"type":"string","enum":["pick","proposal","send","answers","fund","post","payout"]}},"required":["campaignId","line","stepId"],"additionalProperties":false},{"type":"object","properties":{"line":{"type":"string","minLength":1},"stepId":{"type":"string","enum":["welcome","results"]}},"required":["line","stepId"],"additionalProperties":false}]},"id":{"type":"string"},"type":{"type":"string","enum":["data-nudge"]}},"required":["data","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"type":"object","properties":{"operations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"brief":{"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"filters":{"type":"object","properties":{"country":{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},"platform":{"type":"string","description":"Instagram (ig) or TikTok (tt), in either letter case","allOf":[{"enum":["ig","tt"]}]},"tier":{"type":"string","description":"Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one.","allOf":[{"enum":["nano","micro","mid","macro","mega","nano+","micro+","mid+","macro+","micro-","mid-","macro-"]}]}},"additionalProperties":false},"kind":{"type":"string","enum":["search"]},"set":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"}},"required":["brief","count","filters","kind","set"],"additionalProperties":false},{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"kind":{"type":"string","enum":["difference","intersect","union"]},"left":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"},"right":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"},"set":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"}},"required":["count","kind","left","right","set"],"additionalProperties":false},{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"criteria":{"type":"object","properties":{"maxAverageViews":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Keep creators whose average views over their 6 newest posts with a stored video is at most this number, or null"},"minAverageViews":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Keep creators whose average views over their 6 newest posts with a stored video is at least this number, or null. A creator with no view counts fails it"},"minEngagementOnViews":{"anyOf":[{"type":"number","minimum":0,"maximum":1},{"type":"null"}],"description":"Keep creators whose likes plus comments per view over their 6 newest posts with a stored video is at least this fraction, such as 0.05 for 5 percent, or null"},"top":{"anyOf":[{"type":"integer","minimum":1,"maximum":100},{"type":"null"}],"description":"After every other criterion, keep only this many creators with the best fit, or null"},"verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"true keeps only verified accounts, false keeps only unverified accounts, null keeps both"},"country":{"anyOf":[{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},{"type":"null"}]},"maxFollowers":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"minFollowers":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"platform":{"anyOf":[{"type":"string","enum":["ig","tt"]},{"type":"null"}]}},"required":["maxAverageViews","minAverageViews","minEngagementOnViews","top","verified","country","maxFollowers","minFollowers","platform"],"additionalProperties":false},"kind":{"type":"string","enum":["filter"]},"set":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"},"source":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"}},"required":["count","criteria","kind","set","source"],"additionalProperties":false},{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"exclusion":{"type":"string","minLength":1,"maxLength":160,"description":"The creators, accounts, or posts to leave out, as a short noun phrase such as brand accounts"},"kind":{"type":"string","enum":["exclude"]},"set":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"},"source":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"}},"required":["count","exclusion","kind","set","source"],"additionalProperties":false}]}},"state":{"type":"string","enum":["done","running"]}},"required":["operations","state"],"additionalProperties":false},"id":{"type":"string"},"type":{"type":"string","enum":["data-operations"]}},"required":["data","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"type":"object","properties":{"action":{"type":"string","enum":["add_campaign_match","add_campaign_matches","create_campaign","save_list","update_campaign"]},"name":{"type":"string","minLength":1},"path":{"type":"string"}},"required":["action","name","path"],"additionalProperties":false},"id":{"type":"string"},"type":{"type":"string","enum":["data-record"]}},"required":["data","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"anyOf":[{"type":"object","properties":{"host":{"type":"string"},"state":{"type":"string","enum":["reading"]}},"required":["host","state"],"additionalProperties":false},{"type":"object","properties":{"host":{"type":"string"},"state":{"type":"string","enum":["drafting"]},"title":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["host","state","title"],"additionalProperties":false},{"type":"object","properties":{"host":{"type":"string"},"state":{"type":"string","enum":["done"]},"title":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["host","state","title"],"additionalProperties":false},{"type":"object","properties":{"failure":{"type":"string","enum":["InvalidSiteUrl","SiteTimeout","SiteFetchFailed","SiteUnreadable","BriefDraftFailed"]},"host":{"anyOf":[{"type":"string"},{"type":"null"}]},"state":{"type":"string","enum":["failed"]}},"required":["failure","host","state"],"additionalProperties":false}]},"id":{"type":"string"},"type":{"type":"string","enum":["data-site"]}},"required":["data","type"],"additionalProperties":false}]}},"role":{"type":"string","enum":["assistant","user"]}},"required":["id","parts","role"],"additionalProperties":false}},"resultId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Id of the thread result set. It changes whenever the brief or filters change what the set holds, and is null until the thread holds a brief."}},"required":["activeRun","brief","filters","id","turns","messages","resultId"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["threads"],"operationId":"threads.openThread","parameters":[],"description":"Opens a search thread for the calling organization and answers its state: the id, no messages, and no brief yet. It takes no body: the first turn, `POST /api/threads/{threadId}/turns`, carries the brief and the page `context`, and a body that names any field answers 400 `invalid_body`. The id is the durable handle the turn, stream, and stop routes use. An unsigned caller gets 401. The Starcovery web app opens threads for unsigned callers under an anonymous owner key.","summary":"Open thread"}},"/api/threads/{threadId}":{"get":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"activeRun":{"anyOf":[{"type":"string"},{"type":"null"}]},"brief":{"anyOf":[{"type":"string"},{"type":"null"}]},"filters":{"type":"object","properties":{"country":{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},"platform":{"type":"string","description":"Instagram (ig) or TikTok (tt), in either letter case","allOf":[{"enum":["ig","tt"]}]},"tier":{"type":"string","description":"Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one.","allOf":[{"enum":["nano","micro","mid","macro","mega","nano+","micro+","mid+","macro+","micro-","mid-","macro-"]}]}},"additionalProperties":false},"id":{"type":"string"},"turns":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"state":{"type":"string","enum":["running","stopping","committed","failed","stopped"]}},"required":["id","state"],"additionalProperties":false},"description":"The turns the thread admitted, oldest first: each run id and its state, `running` or `stopping` while it is open, then `committed`, `stopped`, or `failed`. A caller that lost the stream of a run finds that run here to learn whether it was admitted and how it ended; a run absent here has not been admitted."},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":128},"parts":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"providerMetadata":{"anyOf":[{"type":"object","properties":{"starcovery":{"anyOf":[{"type":"object","properties":{"line":{"type":"string","enum":["results"]}},"required":["line"],"additionalProperties":false},{"type":"null"}]}},"additionalProperties":false,"description":"Carries `{\"starcovery\":{\"line\":\"results\"}}` on the results line, the reply of a first brief or a pasted website address sent without `context` that has no other reply, so a caller tells that line from any other reply without reading its words. Any other provider metadata is dropped."},{"type":"null"}]},"text":{"type":"string"},"type":{"type":"string","enum":["text"]}},"required":["text","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"type":"object","properties":{"resultId":{"anyOf":[{"type":"string"},{"type":"null"}]},"spec":{"type":"object","properties":{"country":{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},"platform":{"type":"string","description":"Instagram (ig) or TikTok (tt), in either letter case","allOf":[{"enum":["ig","tt"]}]},"tier":{"type":"string","description":"Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one.","allOf":[{"enum":["nano","micro","mid","macro","mega","nano+","micro+","mid+","macro+","micro-","mid-","macro-"]}]},"exclusions":{"type":"array","items":{"type":"string","minLength":1,"maxLength":160,"description":"The creators, accounts, or posts to leave out, as a short noun phrase such as brand accounts"}},"individualCreators":{"type":"boolean","enum":[true],"description":"Present when the brief split read the niche words as asking for individual creators, indie creators, or real people"},"narrowings":{"type":"object","properties":{"maxAverageViews":{"type":"integer","minimum":0,"maximum":9007199254740991},"minAverageViews":{"type":"integer","minimum":0,"maximum":9007199254740991},"minEngagementOnViews":{"type":"number","minimum":0,"maximum":1},"top":{"type":"integer","minimum":1,"maximum":100},"verified":{"type":"boolean"}},"additionalProperties":false},"niche":{"type":"string"},"nicheExclusion":{"type":"string","minLength":1,"description":"The exclusion the brief split read inside the niche words, present only when the niche words leave something out"}},"required":["exclusions","narrowings","niche"],"additionalProperties":false}},"required":["spec"],"additionalProperties":false},"id":{"type":"string"},"type":{"type":"string","enum":["data-brief"]}},"required":["data","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"anyOf":[{"type":"object","properties":{"state":{"type":"string","enum":["pending"]},"action":{"type":"string","enum":["delete_campaign","delete_campaign_attachment","delete_list","remove_campaign_match","request_campaign_funding","request_campaign_send","revoke_api_key","update_campaign","fund_campaign","send_campaign"]},"id":{"type":"string","minLength":1},"input":{"type":"object"},"label":{"type":"string","minLength":1}},"required":["state","action","id","input","label"],"additionalProperties":false},{"type":"object","properties":{"state":{"type":"string","enum":["cancelled"]},"action":{"type":"string","enum":["delete_campaign","delete_campaign_attachment","delete_list","remove_campaign_match","request_campaign_funding","request_campaign_send","revoke_api_key","update_campaign","fund_campaign","send_campaign"]},"id":{"type":"string","minLength":1},"input":{"type":"object"},"label":{"type":"string","minLength":1}},"required":["state","action","id","input","label"],"additionalProperties":false},{"type":"object","properties":{"state":{"type":"string","enum":["confirmed"]},"action":{"type":"string","enum":["delete_campaign","delete_campaign_attachment","delete_list","remove_campaign_match","request_campaign_funding","request_campaign_send","revoke_api_key","update_campaign","fund_campaign","send_campaign"]},"id":{"type":"string","minLength":1},"input":{"type":"object"},"label":{"type":"string","minLength":1}},"required":["state","action","id","input","label"],"additionalProperties":false},{"type":"object","properties":{"denial":{"type":"string","minLength":1,"maxLength":300},"state":{"type":"string","enum":["failed"]},"action":{"type":"string","enum":["delete_campaign","delete_campaign_attachment","delete_list","remove_campaign_match","request_campaign_funding","request_campaign_send","revoke_api_key","update_campaign","fund_campaign","send_campaign"]},"id":{"type":"string","minLength":1},"input":{"type":"object"},"label":{"type":"string","minLength":1}},"required":["denial","state","action","id","input","label"],"additionalProperties":false}]},"id":{"type":"string"},"type":{"type":"string","enum":["data-confirm"]}},"required":["data","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"type":"object","properties":{"freeGrant":{"type":"string","enum":["identified_daily","none","unsigned_daily"]}},"required":["freeGrant"],"additionalProperties":false},"id":{"type":"string"},"type":{"type":"string","enum":["data-exhausted"]}},"required":["data","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"anyOf":[{"type":"object","properties":{"action":{"type":"object","properties":{"label":{"type":"string","minLength":1},"path":{"type":"string"}},"required":["label","path"],"additionalProperties":false},"campaignId":{"type":"string","minLength":1},"line":{"type":"string","minLength":1},"stepId":{"type":"string","enum":["pick","proposal","send","answers","fund","post","payout"]}},"required":["campaignId","line","stepId"],"additionalProperties":false},{"type":"object","properties":{"line":{"type":"string","minLength":1},"stepId":{"type":"string","enum":["welcome","results"]}},"required":["line","stepId"],"additionalProperties":false}]},"id":{"type":"string"},"type":{"type":"string","enum":["data-nudge"]}},"required":["data","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"type":"object","properties":{"operations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"brief":{"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"filters":{"type":"object","properties":{"country":{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},"platform":{"type":"string","description":"Instagram (ig) or TikTok (tt), in either letter case","allOf":[{"enum":["ig","tt"]}]},"tier":{"type":"string","description":"Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one.","allOf":[{"enum":["nano","micro","mid","macro","mega","nano+","micro+","mid+","macro+","micro-","mid-","macro-"]}]}},"additionalProperties":false},"kind":{"type":"string","enum":["search"]},"set":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"}},"required":["brief","count","filters","kind","set"],"additionalProperties":false},{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"kind":{"type":"string","enum":["difference","intersect","union"]},"left":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"},"right":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"},"set":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"}},"required":["count","kind","left","right","set"],"additionalProperties":false},{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"criteria":{"type":"object","properties":{"maxAverageViews":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Keep creators whose average views over their 6 newest posts with a stored video is at most this number, or null"},"minAverageViews":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Keep creators whose average views over their 6 newest posts with a stored video is at least this number, or null. A creator with no view counts fails it"},"minEngagementOnViews":{"anyOf":[{"type":"number","minimum":0,"maximum":1},{"type":"null"}],"description":"Keep creators whose likes plus comments per view over their 6 newest posts with a stored video is at least this fraction, such as 0.05 for 5 percent, or null"},"top":{"anyOf":[{"type":"integer","minimum":1,"maximum":100},{"type":"null"}],"description":"After every other criterion, keep only this many creators with the best fit, or null"},"verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"true keeps only verified accounts, false keeps only unverified accounts, null keeps both"},"country":{"anyOf":[{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},{"type":"null"}]},"maxFollowers":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"minFollowers":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"platform":{"anyOf":[{"type":"string","enum":["ig","tt"]},{"type":"null"}]}},"required":["maxAverageViews","minAverageViews","minEngagementOnViews","top","verified","country","maxFollowers","minFollowers","platform"],"additionalProperties":false},"kind":{"type":"string","enum":["filter"]},"set":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"},"source":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"}},"required":["count","criteria","kind","set","source"],"additionalProperties":false},{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"exclusion":{"type":"string","minLength":1,"maxLength":160,"description":"The creators, accounts, or posts to leave out, as a short noun phrase such as brand accounts"},"kind":{"type":"string","enum":["exclude"]},"set":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"},"source":{"type":"string","minLength":2,"maxLength":8,"description":"A result set id returned by an earlier tool call"}},"required":["count","exclusion","kind","set","source"],"additionalProperties":false}]}},"state":{"type":"string","enum":["done","running"]}},"required":["operations","state"],"additionalProperties":false},"id":{"type":"string"},"type":{"type":"string","enum":["data-operations"]}},"required":["data","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"type":"object","properties":{"action":{"type":"string","enum":["add_campaign_match","add_campaign_matches","create_campaign","save_list","update_campaign"]},"name":{"type":"string","minLength":1},"path":{"type":"string"}},"required":["action","name","path"],"additionalProperties":false},"id":{"type":"string"},"type":{"type":"string","enum":["data-record"]}},"required":["data","type"],"additionalProperties":false},{"type":"object","properties":{"data":{"anyOf":[{"type":"object","properties":{"host":{"type":"string"},"state":{"type":"string","enum":["reading"]}},"required":["host","state"],"additionalProperties":false},{"type":"object","properties":{"host":{"type":"string"},"state":{"type":"string","enum":["drafting"]},"title":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["host","state","title"],"additionalProperties":false},{"type":"object","properties":{"host":{"type":"string"},"state":{"type":"string","enum":["done"]},"title":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["host","state","title"],"additionalProperties":false},{"type":"object","properties":{"failure":{"type":"string","enum":["InvalidSiteUrl","SiteTimeout","SiteFetchFailed","SiteUnreadable","BriefDraftFailed"]},"host":{"anyOf":[{"type":"string"},{"type":"null"}]},"state":{"type":"string","enum":["failed"]}},"required":["failure","host","state"],"additionalProperties":false}]},"id":{"type":"string"},"type":{"type":"string","enum":["data-site"]}},"required":["data","type"],"additionalProperties":false}]}},"role":{"type":"string","enum":["assistant","user"]}},"required":["id","parts","role"],"additionalProperties":false}},"resultId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Id of the thread result set. It changes whenever the brief or filters change what the set holds, and is null until the thread holds a brief."}},"required":["activeRun","brief","filters","id","turns","messages","resultId"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["threads"],"operationId":"threads.readThread","parameters":[{"name":"threadId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Answers the state of a search thread: the id, the brief and filters, the `resultId` of the result set, the stored messages oldest first, and `activeRun`, the run id of the turn still running or stopping, or null. A turn stores its user message when it starts and its reply when it completes, before its stream ends, so a caller that loses a turn stream reconnects through `GET /api/threads/{threadId}/stream` while `activeRun` names the run, and reads the reply here once `activeRun` is null. A turn still open 800 seconds after it started is past the request limit and no longer counts as open. A thread the caller does not own answers 404.","summary":"Read thread"}},"/api/threads/{threadId}/turns":{"post":{"responses":{"200":{"headers":{"cache-control":{"schema":{"type":"string"},"required":true},"x-accel-buffering":{"schema":{"type":"string"},"required":true},"x-vercel-ai-ui-message-stream":{"schema":{"type":"string"},"required":true},"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}},"description":"Success","content":{"text/event-stream":{"schema":{"type":"string","format":"binary"},"x-effect-stream":{"encoding":"uint8array"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"409":{"description":"The thread stores a different message under the same message `id`. | The thread admitted a turn with the same `runId` within the last 24 hours.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/MessageTakenEncoded"},{"$ref":"#/components/schemas/RunTakenEncoded"}]}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["threads"],"operationId":"threads.runThreadTurn","parameters":[{"name":"threadId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Runs the next turn of a search thread and answers an AI SDK UI message stream. The caller names the run with a fresh UUID, which identifies the stream to resume and the run to stop; a run id the thread already admitted answers 409 and changes nothing. A run id stopped before it was sent runs as a stopped turn: it stores the message and ends at once with no reply. A message `id` the thread already stores with the same text runs that message again and replaces its stored reply; an `id` the thread stores for another message answers 409 `message_taken` and runs nothing, and the caller sends the message again under a fresh message `id` and a fresh `runId`.\n\nThe turn reads a pasted website address, refines the brief, or answers from the campaigns, Lists, credits, and API keys of the calling organization, and streams the site progress, the settled brief and its filters, and the reply. A first brief or a pasted website address sent without `context` that has no other reply runs its search in the turn, stores the set, and replies with the results line, such as `Found 1 creator for this brief.`, in a text part whose `providerMetadata` is `{\"starcovery\":{\"line\":\"results\"}}` in the stream and in the stored reply, so a caller finds that line without reading its words; the web app sends `context` and shows that line beside the creators. In `agent` mode the turn may also change those records, while sending proposals, requesting funding, removing a creator from a campaign, deleting a campaign, List, or file, and revoking an API key wait for the customer to click on the site. The reply is stored on the thread, so a disconnected caller reads it back through `GET /api/threads/{threadId}` instead of running the turn again.\n\nEach turn costs 1 use of the daily allowance `GET /api/search` draws on, plus 1 for each search and each exclusion it runs, and past the allowance 1 prepaid credit each; the charge comes before anything else in the turn, and a turn that finds the allowance and the credits spent streams only a `data-exhausted` part. A turn that ends with an `error` chunk gets its charge back, and so does a turn whose website read or brief draft times out, fails with a search or model error, finds no pages to read, or finds no description of a product or audience.\n\n`mode` names the assistant mode, `ask` when omitted. `context` names the page the caller shows beside the thread; the Starcovery web app sends it on every turn, and Starcovery drops a campaign or List in it that the calling organization does not own. A malformed `context` or `mode` answers 400.\n\nA thread the caller does not own answers 404.\n\nTurns share a limit of 50 per 60 seconds per user with a campaign generate that sends no filters; the turns of an unsigned caller share it per client IP with `POST /api/search/parse`. A turn that contains a website address also counts against 10 site reads per 60 seconds; past a limit it answers 429 with `retry-after`.","summary":"Run thread turn","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"context":{"type":"object","properties":{"campaignId":{"type":"string","minLength":1},"listId":{"type":"string","minLength":1},"page":{"type":"string","enum":["/app","/campaigns","/campaigns/$campaignId","/campaigns/new","/creator","/home","/lists","/lists/$listId","/payouts","/payouts/$campaignId/fund","/payouts/account","/proposals","/proposals/$campaignId/terms","/usage"]},"profileId":{"type":"string","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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$","format":"uuid"},"selectedProfileIds":{"type":"array","items":{"type":"string","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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$","format":"uuid"},"maxItems":100},"shownProfileIds":{"type":"array","items":{"type":"string","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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$","format":"uuid"},"maxItems":50}},"required":["page"],"additionalProperties":false,"description":"The page the caller shows beside the thread: its route pattern (`/creator` for a creator page), the campaign, List, or creator profile it names, the selected creators, and the creators on screen in the order the page shows them, one profile id per row. A page that names a campaign or List the calling organization does not own is read-only: the turn changes no campaign or List there, and it reads that campaign only when the caller opens it as a viewer outside the organization that owns it."},"filters":{"type":"object","properties":{"country":{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},"platform":{"type":"string","description":"Instagram (ig) or TikTok (tt), in either letter case","allOf":[{"enum":["ig","tt"]}]},"tier":{"type":"string","description":"Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one.","allOf":[{"enum":["nano","micro","mid","macro","mega","nano+","micro+","mid+","macro+","micro-","mid-","macro-"]}]}},"additionalProperties":false,"description":"Explicit filters for the brief this turn resolves from its text on a thread that holds no brief yet. Omit to derive the filters from the text. A pasted website address drafts its own filters."},"message":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":128},"parts":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string","maxLength":2000,"pattern":"^[^\\u0000]*$"},"type":{"type":"string","enum":["text"]}},"required":["text","type"],"additionalProperties":false},"minItems":1},"role":{"type":"string","enum":["user"]}},"required":["id","parts","role"],"additionalProperties":false},"mode":{"type":"string","enum":["agent","ask"],"description":"The assistant mode the caller picked, `ask` or `agent`. Omit for `ask`."},"runId":{"type":"string","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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$","format":"uuid"}},"required":["message","runId"],"additionalProperties":false}}},"required":true}}},"/api/threads/{threadId}/stream":{"get":{"responses":{"200":{"headers":{"cache-control":{"schema":{"type":"string"},"required":true},"x-accel-buffering":{"schema":{"type":"string"},"required":true},"x-vercel-ai-ui-message-stream":{"schema":{"type":"string"},"required":true},"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}},"description":"Success","content":{"text/event-stream":{"schema":{"type":"string","format":"binary"},"x-effect-stream":{"encoding":"uint8array"}}}},"204":{"description":"<No Content>","headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The query string does not decode against the operation's query schema, and `message` names the failure: the rule the value fails and, for a parameter, the path of the parameter on its own line, such as `at [\"platform\"]`. The api ignores an undeclared query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidQueryEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["threads"],"operationId":"threads.resumeThreadStream","parameters":[{"name":"threadId","in":"path","schema":{"type":"string","minLength":1},"required":true},{"name":"runId","in":"query","schema":{"type":"string","description":"The run to reconnect to. When it names a run that is not the open turn, the answer is 204."},"required":false}],"description":"Reconnects to the turn still open on a thread, running or stopping, and replays it from its first chunk. The stream ends after the turn has stored its outcome. Answers 204 when the thread has no open turn, or when `runId` names another run; `GET /api/threads/{threadId}` then answers the stored messages and each admitted turn. A thread the caller does not own answers 404.","summary":"Resume thread stream"}},"/api/threads/{threadId}/results":{"get":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"creators":{"type":"array","items":{"type":"object","properties":{"averageViews":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Mean views of the creator's 6 newest posts with a stored video, counting the posts that have views. Null when none of them has views."},"bio":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"anyOf":[{"type":"string"},{"type":"null"}]},"emails":{"type":"array","items":{"type":"string","format":"email"},"description":"Contact addresses for this organization after Reveal contact. Empty until then.","default":[]},"engagementOnViews":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Mean of likes plus comments per view over the same posts as averageViews. Null when none of them has views."},"externalUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"fitScore":{"type":"number","minimum":0,"maximum":1},"followerCount":{"type":"integer","allOf":[{"minimum":-9007199254740991,"maximum":9007199254740991},{"minimum":-2147483648,"maximum":2147483647}],"minimum":1000},"hasContact":{"type":"boolean","description":"True when a contact address exists. The address is omitted until this organization reveals it.","default":false},"id":{"type":"string","minLength":1},"isVerified":{"type":"boolean"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"platform":{"type":"string","enum":["ig","tt"]},"profileImageUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"tier":{"type":"string","enum":["nano","micro","mid","macro","mega"]},"username":{"anyOf":[{"type":"string"},{"type":"null"}]},"videos":{"type":"array","items":{"type":"object","properties":{"bunnyStreamId":{"anyOf":[{"type":"string"},{"type":"null"}]},"bunnyThumbnailFile":{"anyOf":[{"type":"string"},{"type":"null"}]},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Video caption, truncated to the first 500 characters."},"commentCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"id":{"type":"string","minLength":1},"isAd":{"type":"boolean"},"isSponsored":{"type":"boolean"},"likeCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"playCount":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"playUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Signed video URL. It expires within 24 hours. Search again for a new URL."},"postedAt":{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},"score":{"type":"number"},"thumbnailUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Signed thumbnail URL. It expires within 24 hours. Search again for a new URL."},"webUrl":{"type":"string","format":"uri"}},"required":["bunnyStreamId","caption","commentCount","id","isAd","isSponsored","likeCount","playCount","playUrl","postedAt","score","thumbnailUrl","webUrl"],"additionalProperties":false}}},"required":["averageViews","bio","country","engagementOnViews","fitScore","followerCount","id","isVerified","name","platform","profileImageUrl","tier","username","videos"],"additionalProperties":false}},"query":{"type":"object","properties":{"country":{"anyOf":[{"type":"string","description":"One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca","pattern":"^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$"},{"type":"string","enum":[""]}]},"platform":{"anyOf":[{"type":"string","description":"Instagram (ig) or TikTok (tt), in either letter case","allOf":[{"enum":["ig","tt"]}]},{"type":"string","enum":[""]}]},"q":{"type":"string","description":"Natural-language creator brief"},"tier":{"anyOf":[{"type":"string","description":"Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one.","allOf":[{"enum":["nano","micro","mid","macro","mega","nano+","micro+","mid+","macro+","micro-","mid-","macro-"]}]},{"type":"string","enum":[""]}]}},"required":["q"],"additionalProperties":false},"ticket":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Single-use shortlist enrichment ticket for POST /api/search/enrich, bound to the search caller. Null when the shortlist is empty or holds more than 100 creators, or when an unsigned caller has no client IP. Absent on the first NDJSON line of a streamed search."}},"required":["creators","query"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"402":{"description":"An unsigned caller has used its daily grant, or an identified caller needs credits that the daily grant does not cover and the prepaid balance holds fewer, or a payment credential on the request did not settle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutOfCreditsEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["threads"],"operationId":"threads.readThreadResults","parameters":[{"name":"threadId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Answers the creators of the thread result set: the set the last turn showed, in the order it showed them, in the search result shape with a shortlist `ticket` for `POST /api/search/enrich`. A search ranks creators by fit score weighted by engagement, and for a brief that asks for creators who film at home it ranks the creators whose captions show a home setting first, so `fitScore` can rise down the list. A set the thread has stored reads free and runs no search. A thread whose brief has no stored set yet runs one search for its brief and filters, billed like `GET /api/search`, and stores the set, so every later read is free; a used grant with no prepaid credits answers 402 `out_of_credits`. A thread with no brief yet, or one the caller does not own, answers 404.","summary":"Read thread results"}},"/api/threads/{threadId}/stop":{"post":{"responses":{"204":{"description":"<No Content>","headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"404":{"description":"A resource the request names does not exist or is not visible to the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["threads"],"operationId":"threads.stopThreadTurn","parameters":[{"name":"threadId","in":"path","schema":{"type":"string","minLength":1},"required":true}],"description":"Closes the named run to new searches, exclusions, and tool calls. A run that has started none of them ends with no reply. A run that has started one lets it finish, then completes its reply from what it has, so its stream and `GET /api/threads/{threadId}/stream` run on until the reply is stored. Starcovery records the stop under the thread and run id, so a stop sent before the run starts still ends that run. A run started again after a stop has a new id, and the earlier stop does not end it. A thread the caller does not own answers 404.","summary":"Stop thread turn","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"runId":{"type":"string","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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$","format":"uuid"}},"required":["runId"],"additionalProperties":false}}},"required":true}}},"/api/feedback":{"post":{"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"],"additionalProperties":false}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}},"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}}}},"401":{"description":"The request carries no credential where the operation needs an identified caller, or carries an API key, access token, or session that does not verify, resolves to no organization, or is a kind the operation does not accept.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedEncoded"}}}},"429":{"headers":{"ratelimit":{"description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset.","required":false,"schema":{"type":"string"}},"ratelimit-limit":{"description":"The uses the quota allows in one window.","required":false,"schema":{"type":"integer"}},"ratelimit-policy":{"description":"The quota and its window, in the form limit;w=seconds.","required":false,"schema":{"type":"string"}},"ratelimit-remaining":{"description":"The uses left in the current window.","required":false,"schema":{"type":"integer"}},"ratelimit-reset":{"description":"The seconds until the window resets.","required":false,"schema":{"type":"integer"}},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[{},{"bearer":[]},{"apiKey":[]},{"session":[]}],"tags":["feedback"],"operationId":"feedback.submitFeedback","parameters":[],"description":"Records one bug or feature report, with the site path it concerns, for the Starcovery team. Takes a credential or none; the report records the site path, whether the caller was signed in, and the Starcovery environment, never the account. Allows 20 reports per hour per user, or 5 per hour per client IP for an unsigned caller; past the limit it answers 429 with `retry-after`.","summary":"Submit feedback","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string","maxLength":3894,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$"},"path":{"type":"string","maxLength":500},"title":{"type":"string","maxLength":200,"pattern":"^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$"}},"required":["body","path","title"],"additionalProperties":false}}},"required":true}}},"/agent/identity":{"post":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"assertion_expires":{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},"claim_token":{"type":"string","minLength":1},"claim_token_expires":{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},"claim_url":{"type":"string","format":"uri"},"identity_assertion":{"type":"string","minLength":1},"post_claim_scopes":{"type":"array","items":{"anyOf":[{"type":"string","enum":["organization"]}]}},"pre_claim_scopes":{"type":"array","items":{"anyOf":[{"type":"string","enum":["organization"]}]}},"registration_id":{"type":"string","minLength":1},"registration_type":{"type":"string","enum":["anonymous"]}},"required":["assertion_expires","claim_token","claim_token_expires","claim_url","identity_assertion","post_claim_scopes","pre_claim_scopes","registration_id","registration_type"],"additionalProperties":false}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}}},"429":{"headers":{"ratelimit":{"schema":{"type":"string","description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset."},"required":false},"ratelimit-limit":{"schema":{"type":"string","description":"The uses the quota allows in one window."},"required":false},"ratelimit-policy":{"schema":{"type":"string","description":"The quota and its window, in the form limit;w=seconds."},"required":false},"ratelimit-remaining":{"schema":{"type":"string","description":"The uses left in the current window."},"required":false},"ratelimit-reset":{"schema":{"type":"string","description":"The seconds until the window resets."},"required":false},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}}},"security":[],"tags":["agent"],"operationId":"agent.registerAgentIdentity","parameters":[],"description":"Registers an anonymous agent identity with no human in the loop. Returns a service-signed `identity_assertion` to exchange for an access token at `POST /oauth2/token`, the pre-claim and post-claim scopes, and the claim materials. The `claim_token` is returned once.\n\nOne client IP registers at most 10 times per rolling 24 hours, and registrations are capped at 100 per UTC day across every caller; past either cap it answers 429 `rate_limited`. The full protocol is at `/agents`.","summary":"Register agent identity","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["anonymous"]}},"required":["type"],"additionalProperties":false}}},"required":true}}},"/agent/identity/claim":{"post":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"claim_attempt":{"type":"object","properties":{"expires_in":{"anyOf":[{"type":"number"},{"type":"string","enum":["Infinity","-Infinity","NaN"]}]},"interval":{"anyOf":[{"type":"number"},{"type":"string","enum":["Infinity","-Infinity","NaN"]}]},"verification_uri":{"type":"string","format":"uri"}},"required":["expires_in","interval","verification_uri"],"additionalProperties":false},"claim_attempt_id":{"type":"string","minLength":1},"expires_at":{"type":"string","format":"date-time","pattern":"^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"},"registration_id":{"type":"string","minLength":1},"status":{"type":"string","enum":["initiated"]}},"required":["claim_attempt","claim_attempt_id","expires_at","registration_id","status"],"additionalProperties":false}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}}},"401":{"description":"No registration matches the claim token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidClaimTokenEncoded"}}}},"409":{"description":"The registration the claim token names is already claimed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimedOrInFlightEncoded"}}}},"410":{"description":"The registration the claim token names has expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimExpiredEncoded"}}}},"422":{"description":"The email address fails validation or belongs to a disposable mail provider.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UndeliverableEmailEncoded"}}}},"429":{"headers":{"ratelimit":{"schema":{"type":"string","description":"The quota name, the remaining uses, and the seconds until the window resets, in the form \"name\"; r=remaining; t=reset."},"required":false},"ratelimit-limit":{"schema":{"type":"string","description":"The uses the quota allows in one window."},"required":false},"ratelimit-policy":{"schema":{"type":"string","description":"The quota and its window, in the form limit;w=seconds."},"required":false},"ratelimit-remaining":{"schema":{"type":"string","description":"The uses left in the current window."},"required":false},"ratelimit-reset":{"schema":{"type":"string","description":"The seconds until the window resets."},"required":false},"retry-after":{"schema":{"type":"string","pattern":"^[+-]?\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?$"},"required":true}},"description":"The caller has passed a rate limit, and the `retry-after` header gives the number of seconds to wait before the next attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitedEncoded"}}}},"503":{"description":"The deployment has no mail sender or email validation key, so it cannot send a claim link.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnconfiguredEncoded"}}}}},"security":[],"tags":["agent"],"operationId":"agent.startAgentClaim","parameters":[],"description":"Starts the claim that binds a human to an agent identity. Send the `claim_token` and the human email address; Starcovery mails a one-time link to that address. Poll `POST /oauth2/token` with the claim grant at the returned `interval` until it stops answering `authorization_pending`. A deployment with no mail provider or no claim address validator answers 503 `unconfigured`.","summary":"Start agent claim","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"claim_token":{"type":"string","minLength":1},"email":{"type":"string","format":"email"}},"required":["claim_token","email"],"additionalProperties":false}}},"required":true}}},"/agent/identity/claim/complete":{"post":{"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["claimed"]}},"required":["status"],"additionalProperties":false}}}},"400":{"description":"The request body or a header does not decode against the operation's schema, the `content-type` of a JSON request body is not `application/json`, the upload body is empty, a signed Stripe webhook body is not JSON or lacks a field that settlement reads, or a signed Zernio webhook body is not a JSON event, and `message` names the failure. For a decode failure, `message` states the rule the value fails and, for a field, adds the path of the field on its own line, such as `at [\"contract\"][\"deliverable\"]`. A request body without a `content-type` reads as JSON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidBodyEncoded"}}}},"409":{"description":"Another account already uses the email address of the claim attempt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTakenEncoded"}}}},"410":{"description":"The claim attempt token matches no open, unexpired claim attempt on a pending registration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidClaimAttemptTokenEncoded"}}}}},"security":[],"tags":["agent"],"operationId":"agent.completeAgentClaim","parameters":[],"description":"Completes a claim with the `claim_attempt_token` contained in the mailed link.","summary":"Complete agent claim","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"claim_attempt_token":{"type":"string","minLength":1}},"required":["claim_attempt_token"],"additionalProperties":false}}},"required":true}}}}}