Thumbnails
/team/thumbnails/usage
GET /team/thumbnails/usageGet current thumbnail generation quota and usage for your team. Returns up to three quota pools: the free pool (included with every plan), an optional add-on pool (monthly subscription), and an optional pack pool (one-time purchased credits). The total_remaining field provides the combined remaining generations across all pools.
Rate limit: 60 requests per minute
Request
No request body required.
Response (200)
{
"success": true,
"data": {
"eligible": true,
"free_pool": {
"limit": 5,
"used": 2,
"reserved": 1,
"remaining": 2,
"next_reset": "2026-04-01"
},
"addon_pool": {
"limit": 50,
"used": 10,
"reserved": 0,
"remaining": 40,
"next_reset": "2026-04-15"
},
"pack_pool": {
"limit": 100,
"used": 5,
"reserved": 0,
"remaining": 95,
"next_reset": null
},
"total_remaining": 137
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
| success | boolean | Request success |
| data.eligible | boolean | Whether the team is eligible for thumbnail generation (requires active subscription) |
| data.free_pool | object | Free pool included with every plan |
| data.free_pool.limit | integer | Monthly free generation limit |
| data.free_pool.used | integer | Completed generations this period |
| data.free_pool.reserved | integer | In-progress generations (counted against remaining until completed or released) |
| data.free_pool.remaining | integer | Available generations (limit minus used minus reserved) |
| data.free_pool.next_reset | string|null | Pool reset date (Y-m-d format) |
| data.addon_pool | object|null | Monthly add-on subscription pool (null if not subscribed). Same fields as free_pool. |
| data.pack_pool | object|null | One-time purchased credit pack (null if none purchased). Same fields as free_pool. next_reset is always null — pack credits do not expire. |
| data.total_remaining | integer | Combined remaining across all active pools |
/channels/{id}/thumbnails/generations
POST /channels/{id}/thumbnails/generationsCreate an asynchronous thumbnail generation for a channel. Three main modes: (1) **Idea-based** — provide an idea_id to generate a final 2K thumbnail from an existing idea. (2) **Brainstorm** — provide a prompt (no idea_id) to generate concept sketches at 1K resolution. Brainstorm results are stored as concept variations on a new idea; to produce final 2K thumbnails, call this endpoint again with the returned idea_id. (3) **Clone** — provide a clone_strategy and reference_image_url to generate thumbnails that match an existing thumbnail's style. The generation runs in the background; poll the returned run_id for status or use callback_url for async notification.
Rate limit: 12 requests per minute
Request
JSON body. Path id is your Subscribr channel ID. Requires active subscription (403 if ineligible).
Parameters
| Name | Type | Description |
|---|---|---|
| id | integer | Subscribr channel ID (path). |
Request Body Fields
| Field | Type | Required | Description |
|---|---|---|---|
| idea_id | integer | No | Idea-based or improvement mode. Must belong to channel. |
| prompt | string | No | Required for brainstorm/clone when idea_id omitted. Max 2000. |
| topic | string | No | Brainstorm context. Max 1000. |
| num_variations | integer | No | 1–8. Default 1 with idea_id, 4 without. Each variation reserves one quota unit when idea_id set. |
| callback_url | string | No | HTTPS callback (not team webhooks). Max 2048. |
| callback_secret | string | No | Signs callback body via X-Subscribr-Signature. Max 255. |
| improvement_mode | boolean | No | Requires idea_id, feedback, reference_variation_url. |
| feedback | string | No | Required when improvement_mode=true. Max 5000. |
| reference_variation_url | string | No | HTTPS URL. Required when improvement_mode=true. |
| clone_strategy | string | No | direct_reference or style_analysis |
| reference_image_url | string | No | HTTPS reference image. Required when clone_strategy set. |
{
"idea_id": 42,
"num_variations": 3,
"callback_url": "https://partner.example.com/subscribr/thumbnail-callback",
"callback_secret": "whsec_thumbnail_partner_secret"
}
Response (202)
{
"success": true,
"data": {
"run_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"run_ids": [
"9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
],
"status": "queued"
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
| data.run_id | string | Primary generation run ID (UUID). Use this to poll status via the Get Generation Status endpoint. |
| data.run_ids | array | All run IDs for this request. When num_variations > 1 with an idea_id, each variation gets its own run ID that can be polled individually. |
| data.status | string | Initial status (always "queued") |
| data.idea_id | integer | Returned only for clone modes — the auto-created idea ID |
- Clone with style_analysis: When clone_strategy=style_analysis, the response has a different shape: { idea_id, status: "style_analysis_pending", message }. Style analysis runs asynchronously before thumbnail generation. Use a callback_url to be notified when analysis completes, then call this endpoint again with the returned idea_id to generate the final thumbnail.
- Quota consumption: Quota is reserved per generation run. When num_variations > 1 with an idea_id, each variation gets its own run_id and consumes one quota unit. Brainstorm mode (no idea_id) reserves one unit for the batch. Reserved quota is released if a run fails.
Error Responses
| Status | Error code | Description |
|---|---|---|
| 403 | not eligible for thumbnail generation | No active subscription |
| 404 | Idea not found in this channel | Invalid idea_id |
| 429 | (quota) | Insufficient thumbnail quota |
/channels/{id}/thumbnails/generations/{runId}
GET /channels/{id}/thumbnails/generations/{runId}Get the current status and results of a thumbnail generation. When the status is "completed", the output_urls array contains URLs to the generated thumbnail images. Poll this endpoint after creating a generation to track progress.
Rate limit: 120 requests per minute
Request
No request body required.
Parameters
| Name | Type | Description |
|---|---|---|
| id | integer | Channel ID (path parameter). |
| runId | string | Generation run ID returned from the Create endpoint (path parameter). |
Response (200)
{
"success": true,
"data": {
"run_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"status": "completed",
"idea_id": null,
"output_urls": [
"https://subscribr.ai/storage/thumbnails/9b1deb4d_v1.png",
"https://subscribr.ai/storage/thumbnails/9b1deb4d_v2.png"
],
"created_at": "2026-02-27T10:30:00Z",
"updated_at": "2026-02-27T10:30:45Z"
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
| data.run_id | string | Generation run identifier (UUID) |
| data.status | string | Status: queued (processing), completed (output ready), or failed |
| data.idea_id | integer|null | Linked idea ID (present when using idea-based or clone modes) |
| data.output_urls | array | Generated thumbnail image URLs (populated when status is "completed", empty otherwise) |
| data.output_urls[] | string | URL to a generated thumbnail image |
| data.created_at | string | ISO 8601 creation timestamp |
| data.updated_at | string | ISO 8601 last update timestamp (indicates when status last changed) |
/channels/{id}/thumbnails/generations
GET /channels/{id}/thumbnails/generationsList past thumbnail generation runs for a channel. Returns a paginated list (15 per page) ordered by most recent first. Optionally filter by source_type to narrow results to a specific generation mode.
Rate limit: 120 requests per minute
Request
Optional query parameters to filter and paginate results.
Parameters
| Name | Type | Description |
|---|---|---|
| id | integer | Channel ID (path parameter). |
| source_type | string | Filter by ThumbnailUsageEvent source_type: api_generate (idea-based and brainstorm API runs), idea_improve, thumbnail_clone |
| page | integer | Page number (default 1). |
Response (200)
{
"success": true,
"data": [
{
"run_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"status": "completed",
"source_type": "api_generate",
"idea_id": 42,
"output_urls": [
"https://subscribr.ai/storage/thumbnails/9b1deb4d_v1.png"
],
"created_at": "2026-02-27T10:30:00Z"
}
],
"meta": {
"current_page": 1,
"last_page": 3,
"per_page": 15,
"total": 42
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
| data[] | array | List of generation run objects |
| data[].run_id | string | Run identifier (UUID) — use with the Get Generation Status endpoint |
| data[].status | string | Status: queued, completed, or failed |
| data[].source_type | string | api_generate, idea_improve, or thumbnail_clone |
| data[].idea_id | integer|null | Linked idea ID (null for brainstorm runs without a pre-existing idea) |
| data[].output_urls | array | Generated thumbnail URLs (empty for queued/failed runs) |
| data[].created_at | string | ISO 8601 creation timestamp |
| meta.current_page | integer | Current page number |
| meta.last_page | integer | Total number of pages |
| meta.per_page | integer | Items per page (15) |
| meta.total | integer | Total matching generation runs |