ChannelSponsorsResponse
{
"type": "object",
"properties": {
"channel": {
"type": "object",
"properties": {
"id": {
"type": [
"string",
"null"
],
"description": "Public entity id (\"ent_{n}\") of the channel. Null when the channel has media in the index but no entity record yet."
},
"youtube_channel_id": {
"type": "string",
"description": "YouTube channel id as supplied in the request path."
},
"name": {
"type": [
"string",
"null"
],
"description": "Channel name. Null when no entity record exists."
},
"page": {
"type": [
"string",
"null"
],
"description": "The channel's page on arcmira.com, absolute. Null when no channel is known."
}
},
"required": [
"id",
"youtube_channel_id",
"name",
"page"
]
},
"sponsors": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ChannelSponsor"
},
"description": "Recurring sponsors ordered by ad read count (descending)."
},
"meta": {
"type": "object",
"properties": {
"min_ad_reads": {
"type": "integer",
"description": "The min_ad_reads threshold applied (default 3)."
},
"count": {
"type": "integer",
"description": "Number of sponsors returned."
},
"total": {
"type": "integer",
"description": "Sponsors in the rollup at the applied threshold. Greater than count only when the plan gate cut the list to the free slice."
}
},
"required": [
"min_ad_reads",
"count",
"total"
]
},
"access": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"invalid_request_error",
"authentication_error",
"permission_error",
"quota_exceeded",
"rate_limit_error",
"not_found",
"conflict_error",
"server_error"
],
"description": "The error class. It fixes the HTTP status: invalid_request_error 400, authentication_error 401, quota_exceeded 402, permission_error 403, not_found 404, conflict_error 409, rate_limit_error 429, server_error 500. Switch on it for retry and gate handling."
},
"code": {
"type": "string",
"description": "The specific condition, stable and snake_case; doc_url anchors on it. x-arcmira-codes on this schema lists every code with its type, gate and meaning. The list is open: new codes may appear inside an existing type, so switch on type and gate first."
},
"reason": {
"type": "string",
"enum": [
"no_credential",
"invalid",
"revoked"
],
"description": "Only on invalid_api_key. no_credential: nothing was sent. invalid: a credential was sent and is unknown or malformed. revoked: the key exists and is no longer usable."
},
"message": {
"type": "string",
"description": "One plain line. Names the fix or the unlock."
},
"param": {
"type": "string",
"description": "The query or body parameter the gate refused, when one did."
},
"gate": {
"type": "string",
"enum": [
"rows",
"key",
"plan",
"freshness",
"exposure_law",
"rate",
"pagination"
],
"description": "Which boundary refused. Present on every gate error; switch on it without parsing the message."
},
"resource": {
"$ref": "#/components/schemas/ErrorResource"
},
"unlock": {
"type": "object",
"properties": {
"tier": {
"type": "string",
"description": "The plan that lifts the gate."
},
"url": {
"type": "string",
"description": "Absolute upgrade or sign-up URL carrying its ?src= attribution. Use it verbatim."
},
"offer": {
"type": "null",
"description": "Reserved for the agent-discount offer. Always null today."
},
"action": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"description": "What the call does. send_signup_code sends a verification code to an address for an account key."
},
"method": {
"type": "string",
"description": "HTTP method to use."
},
"url": {
"type": "string",
"description": "Absolute endpoint carrying its ?src= attribution. Call it verbatim."
}
},
"required": [
"kind",
"method",
"url"
],
"description": "The request that lifts the gate with no human, present when the caller can fix this itself. A key gate carries the signup send here; a plan or quota gate has no action and its url is a page a person opens."
}
},
"required": [
"tier",
"url",
"offer"
],
"description": "How to lift the gate. Present when the gate has an unlock."
},
"retry_after_seconds": {
"type": "integer",
"description": "Present on rate gates. Mirrors the Retry-After header."
},
"details": {
"type": "object",
"properties": {
"quote": {
"$ref": "#/components/schemas/RefusedQuote"
},
"limit": {
"$ref": "#/components/schemas/Limit"
},
"url": {
"type": "string",
"description": "On terms_acceptance_required: the page where the person accepts the updated Terms of Service. On terms_updated: the Terms of Service page."
}
},
"description": "Machine data the refusal carries for you to act on. Present only on the codes that name a field here."
},
"doc_url": {
"type": "string"
},
"request_id": {
"type": "string"
}
},
"required": [
"type",
"code",
"message",
"doc_url",
"request_id"
],
"description": "The gate that reduced this response. Present only when something was withheld; carries the same code, gate, and unlock an outright refusal would."
}
},
"required": [
"channel",
"sponsors",
"meta"
]
}