{
  "openapi": "3.1.0",
  "info": {
    "title": "SocialCrawl API: Reddit",
    "version": "1.0.0",
    "description": "Unified social media data API - one API key, one consistent response format, 69 platforms, 678 endpoints. Power AI agents with clean social data.\n\nThis document covers the Reddit endpoints only (14 operations). The full contract for every platform is at https://www.socialcrawl.dev/v1/openapi.json, and every per-platform document is listed at https://www.socialcrawl.dev/openapi/index.json.",
    "contact": {
      "name": "SocialCrawl",
      "url": "https://www.socialcrawl.dev",
      "email": "socialcrawl@ridio.io"
    }
  },
  "servers": [
    {
      "url": "https://www.socialcrawl.dev/v1",
      "description": "Production"
    }
  ],
  "security": [
    {
      "ApiKeyAuth": []
    },
    {
      "BearerAuth": []
    }
  ],
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key",
        "description": "API key authentication. Send your key in the `x-api-key` request header on every call. Create and manage keys in the dashboard."
      },
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "The same API key sent as `Authorization: Bearer <key>`, the default in most agents and HTTP tools. Same key, same rules; when both headers are sent, `x-api-key` wins."
      }
    },
    "schemas": {
      "ErrorEnvelope": {
        "type": "object",
        "description": "Unified error response envelope. Every 4xx/5xx response returns this shape; `error.type` is a machine-readable code from the API's error catalog.",
        "properties": {
          "success": {
            "type": "boolean",
            "enum": [
              false
            ],
            "example": false,
            "description": "Always false on an error response."
          },
          "error": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "MISSING_API_KEY",
                  "INVALID_API_KEY",
                  "INSUFFICIENT_CREDITS",
                  "INVALID_REQUEST",
                  "ENDPOINT_NOT_FOUND",
                  "RESOURCE_NOT_FOUND",
                  "CONCURRENCY_LIMIT",
                  "UPSTREAM_ERROR",
                  "SERVICE_UNAVAILABLE",
                  "INTERNAL_ERROR",
                  "METHOD_NOT_ALLOWED",
                  "IDEMPOTENCY_KEY_CONFLICT",
                  "IDEMPOTENCY_IN_PROGRESS",
                  "IDEMPOTENCY_REPLAY_UNAVAILABLE",
                  "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                  "COHORT_MEMBER_LIMIT_EXCEEDED",
                  "COHORT_LIMIT_EXCEEDED",
                  "COHORT_IDENTITY_PLATFORM_UNSUPPORTED",
                  "COHORT_IDENTITY_CONFLICT",
                  "COHORT_QUERY_NOT_CANCELLABLE",
                  "COHORT_QUERY_NOT_READY",
                  "COHORT_RESULT_TOO_LARGE",
                  "PAYLOAD_TOO_LARGE",
                  "RATE_LIMITED",
                  "KEY_BUDGET_EXCEEDED",
                  "RUN_NOT_FOUND",
                  "RUN_STATE_CONFLICT",
                  "RUN_EXPIRED",
                  "NEEDS_ASYNC",
                  "CURSOR_EXPIRED",
                  "SCHEDULE_NOT_FOUND",
                  "STREAM_NOT_FOUND",
                  "STREAM_STATE_CONFLICT"
                ],
                "example": "INVALID_REQUEST",
                "description": "Machine-readable error code. The per-status `x-error-codes` list on each response narrows which codes that status can carry."
              },
              "message": {
                "type": "string",
                "description": "Human-readable explanation of the error."
              },
              "status": {
                "type": "integer",
                "description": "HTTP status code, echoed in the body."
              },
              "doc_url": {
                "type": "string",
                "description": "Link to the docs page for this error code."
              },
              "retryable": {
                "type": "boolean",
                "description": "Whether retrying the identical request can succeed. True for rate limits, concurrency limits, idempotency contention and transient upstream or server failures; false for every other code, including both 402s."
              },
              "details": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": true,
                "description": "Optional structured context. Omitted on ordinary errors. Both 402s carry `reason` (`balance_too_low` or `key_budget_reached`), `retry_will_succeed: false`, a one-sentence `next_step`, and `top_up_url` or `key_settings_url`; the GET endpoints add `credits_required`; a metered endpoint adds `pricing` (`\"ceiling\"` when the hold is the most the call can cost and the unused part is refunded, `\"exact\"` when the call is charged what it holds; measured on recent production calls), `credits_typical` (on a ceiling, what a call like this is usually charged), and, when a cheaper shape of the same request exists, `lower_cost_with`, `lower_cost_options` (`param`, `value` or null to leave it out, and `credits_required` with that change) and `credits_required_cheapest`. A `max_credits` page that switched to a cheaper form to fit (`threads/search` with `expand=false`) and still found the balance short adds `balance_fallback`: the `param` and `value` it switched to, and `credits_required` for the call as sent. A page-cap rejection carries `reason: \"page_limit\"` with `max_page`, `requested_page` and `narrow_with`. An `INVALID_REQUEST` that sends no member of a required one-of group carries `fields` (the parameters of that group) and a one-sentence `next_step`. Other endpoints use it for their own taxonomies, such as the comment-lookup not-found reasons."
              },
              "status_url": {
                "type": "string",
                "format": "uri",
                "description": "Present on 5xx responses: the public status page, filtered to the platform when one is known."
              },
              "incident": {
                "type": "object",
                "description": "Present on a 5xx response when an open public incident explains the failure.",
                "properties": {
                  "id": {
                    "type": "string",
                    "example": "k3v9w2m8q1zt"
                  },
                  "title": {
                    "type": "string"
                  },
                  "status": {
                    "type": "string",
                    "example": "investigating"
                  },
                  "impact": {
                    "type": "string",
                    "example": "major"
                  },
                  "url": {
                    "type": "string",
                    "format": "uri"
                  }
                },
                "required": [
                  "id",
                  "title",
                  "status",
                  "impact",
                  "url"
                ]
              }
            },
            "required": [
              "type",
              "message",
              "status",
              "doc_url"
            ]
          },
          "credits_used": {
            "type": "integer",
            "description": "Net credits charged for this request. Error paths deduct-then-refund, so this is 0 in almost every case; a partial-coverage composite may keep the succeeded-leg cost."
          },
          "credits_remaining": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Credits left after this request when established. Some unauthenticated errors use null; on a prebilling route whose attempted balance lookup fails, this field is omitted instead of fabricated."
          },
          "request_id": {
            "type": "string",
            "description": "Unique request identifier - matches the X-Request-Id header. Quote it in support requests."
          }
        },
        "required": [
          "success",
          "error",
          "credits_used",
          "request_id"
        ]
      },
      "MonitorAlertRule": {
        "description": "A numeric condition evaluated against a monitor run and, for change operators, a previous comparable run.",
        "properties": {
          "metric": {
            "description": "Dot path to a numeric key in the recipe's own result, for example `coverage` or `summary.total`. On a numbers-only monitor (created with `track`) the metric must be one of `track.metrics`, and an `items[].<path>` metric is evaluated once per row: a fired alert then carries `row_id`. The special metric `rows_new` (numbers-only monitors only; it needs an `items[].` metric in `track.metrics` and is not itself tracked) counts the list rows this run has that the previous run did not: `{\"metric\":\"rows_new\",\"op\":\"gt\",\"value\":0}` alerts on any new post or video. It accepts only `gt` and `gte`, and is skipped on the first run. \"New\" means absent from the previous successful run's stored rows (capped at `max_rows`, default 100), so a row that drops off and returns later counts as new again. An empty-page run is refunded and is not a baseline, so on a sparse feed the first run that holds rows has no baseline and stays silent: the first new post after a quiet period may not alert. Use a daily cadence or leave `max_rows` headroom.",
            "type": "string"
          },
          "op": {
            "enum": [
              "gt",
              "lt",
              "gte",
              "lte",
              "abs_change_gt",
              "pct_change_gt",
              "pct_change_lt"
            ],
            "type": "string"
          },
          "value": {
            "type": "number"
          },
          "window": {
            "description": "Accepted and stored, but ignored: a change op always compares against the immediately preceding comparable run, whatever the value.",
            "enum": [
              "1d",
              "1w"
            ],
            "type": "string"
          }
        },
        "required": [
          "metric",
          "op",
          "value"
        ],
        "type": "object"
      },
      "EventEnvelope": {
        "description": "One event, identical in the feed and in every webhook batch. `id` is stable for one fact, so deduplicate on it.",
        "properties": {
          "id": {
            "description": "Deterministic event id: the same fact never mints a second event.",
            "example": "evt_k3m7q2xwcbvd4nph6trz5ycgda",
            "type": "string"
          },
          "type": {
            "description": "Dot-delimited lower-case type. Types written today: `discover.progress`, `discover.accounts_ready`, `discover.completed`, `discover.partial`, `discover.paused`, `discover.failed`, `discover.new_rows`, `discover.new_accounts`, `discover.new_items`, `discover.run_skipped`, `discover.run_failed`, `endpoint.disabled`, `mention.created`, `mention.deleted`, `stream.baseline.established`, `stream.coverage_gap`, `stream.paused`, `stream.resumed`, `stream.deleted`, `stream.budget.warning`, `stream.health`.",
            "example": "discover.completed",
            "type": "string"
          },
          "api_version": {
            "example": "2026-10-01",
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "cursor": {
            "description": "The feed position right after this event. Send it as `cursor` to read what came after; an event id works too.",
            "example": "c_MS4xMi4xNzkyNDA0OTA0",
            "type": "string"
          },
          "subject": {
            "description": "The object the event is about, for example `{ kind: \"discover_run\", id: \"run_…\" }`.",
            "properties": {
              "id": {
                "type": "string"
              },
              "kind": {
                "type": "string"
              },
              "metadata": {
                "type": [
                  "object",
                  "null"
                ]
              },
              "name": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "kind",
              "id"
            ],
            "type": [
              "object",
              "null"
            ]
          },
          "data": {
            "description": "The event's facts. Discover events carry counts and ids, never keywords or row text.",
            "type": "object"
          },
          "links": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Absolute URLs to the subject, such as `run` and `results` (for example `https://www.socialcrawl.dev/v1/prism/discover/runs/run_...`), the same in the feed and in webhook batches. Events served before 26/10/2026 carried relative paths.",
            "type": "object"
          }
        },
        "required": [
          "id",
          "type",
          "api_version",
          "created_at",
          "cursor",
          "subject",
          "data",
          "links"
        ],
        "type": "object"
      },
      "WebhookEndpoint": {
        "description": "A registered receiver. The signing secret is never part of it: it is returned once, by create and by rotate-secret.",
        "properties": {
          "id": {
            "example": "we_V1StGXR8Z5jdHi6BmyT",
            "type": "string"
          },
          "url": {
            "example": "https://example.com/hooks/socialcrawl",
            "type": "string"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "types": {
            "description": "Subscribed event types: exact types, `ns.*` wildcards, or `*` for every type.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "subject_ids": {
            "description": "Only events about these subjects (a run or schedule id); null for every subject.",
            "items": {
              "type": "string"
            },
            "type": [
              "array",
              "null"
            ]
          },
          "status": {
            "enum": [
              "enabled",
              "disabled"
            ],
            "type": "string"
          },
          "disabled_reason": {
            "description": "`gone` (the receiver answered 410), `failing` (5 consecutive days of failed deliveries), `key_revoked` (the creating key was revoked or deleted) or `user` (set with PATCH). Null while enabled.",
            "enum": [
              "gone",
              "failing",
              "key_revoked",
              "user",
              null
            ],
            "type": [
              "string",
              "null"
            ]
          },
          "failing_since": {
            "description": "Start of the current run of failed deliveries; null while healthy.",
            "format": "date-time",
            "type": [
              "string",
              "null"
            ]
          },
          "api_version": {
            "example": "2026-10-01",
            "type": "string"
          },
          "secret_rotation": {
            "description": "Set during a rotation: until `previous_secret_expires_at` every delivery is signed with both secrets.",
            "properties": {
              "previous_secret_expires_at": {
                "format": "date-time",
                "type": "string"
              }
            },
            "type": [
              "object",
              "null"
            ]
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "type": "string"
          },
          "next": {
            "description": "Ready relative URLs for the next calls.",
            "properties": {
              "attempts_url": {
                "type": "string"
              },
              "events_url": {
                "type": "string"
              },
              "rotate_secret_url": {
                "type": "string"
              },
              "self_url": {
                "type": "string"
              },
              "test_url": {
                "type": "string"
              }
            },
            "type": "object"
          }
        },
        "required": [
          "id",
          "url",
          "types",
          "status",
          "api_version",
          "created_at"
        ],
        "type": "object"
      },
      "WebhookAttempt": {
        "description": "One delivery attempt. `response_excerpt` is at most 1 KB of your receiver's answer.",
        "properties": {
          "id": {
            "type": "string"
          },
          "delivery_id": {
            "description": "The batch's `webhook-id`, the same on every retry.",
            "type": "string"
          },
          "test": {
            "type": "boolean"
          },
          "status": {
            "description": "Your receiver's HTTP status; null for a timeout, a refused host, a network error or a secret that could not be opened.",
            "type": [
              "integer",
              "null"
            ]
          },
          "outcome": {
            "enum": [
              "delivered",
              "failed",
              "gone",
              "retry_after",
              "timeout",
              "redirect",
              "refused_host",
              "secret_unavailable",
              "network_error"
            ],
            "type": "string"
          },
          "duration_ms": {
            "type": [
              "integer",
              "null"
            ]
          },
          "response_excerpt": {
            "type": [
              "string",
              "null"
            ]
          },
          "error": {
            "type": [
              "string",
              "null"
            ]
          },
          "created_at": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "id",
          "delivery_id",
          "test",
          "status",
          "outcome",
          "created_at"
        ],
        "type": "object"
      },
      "EventBatch": {
        "description": "What every delivery carries, also for one event: at most 100 events or 256 KB. Each inner event keeps its own `id` and `cursor`; deduplicate on the inner ids. A test send marks its event `\"test\": true` with `\"cursor\": null`.",
        "properties": {
          "id": {
            "example": "bat_V1StGXR8Z5jdHi6BmyT",
            "type": "string"
          },
          "type": {
            "const": "event.batch",
            "type": "string"
          },
          "data": {
            "properties": {
              "events": {
                "items": {
                  "$ref": "#/components/schemas/EventEnvelope"
                },
                "maxItems": 100,
                "type": "array"
              }
            },
            "required": [
              "events"
            ],
            "type": "object"
          }
        },
        "required": [
          "id",
          "type",
          "data"
        ],
        "type": "object"
      },
      "ListeningRuleAst": {
        "description": "A rule as a tree of `and`, `or`, `not`, `term`, `phrase` and `field` nodes, as the dry run returns it in `data.stream.groups[].ast`.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "and": {
                "minItems": 1,
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/ListeningRuleAst"
                }
              }
            },
            "required": [
              "and"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "or": {
                "minItems": 1,
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/ListeningRuleAst"
                }
              }
            },
            "required": [
              "or"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "not": {
                "$ref": "#/components/schemas/ListeningRuleAst"
              }
            },
            "required": [
              "not"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "term": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "term"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "phrase": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "phrase"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "field": {
                "type": "string",
                "enum": [
                  "lang",
                  "country",
                  "platform",
                  "site",
                  "community"
                ]
              },
              "value": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "field",
              "value"
            ],
            "additionalProperties": false
          }
        ]
      }
    }
  },
  "tags": [
    {
      "name": "reddit",
      "description": "Reddit endpoints"
    }
  ],
  "paths": {
    "/reddit/subreddit": {
      "get": {
        "summary": "List Reddit subreddit posts",
        "description": "Returns a list of posts from a subreddit. Each post includes the title, the post body at `ext.selftext`, score, comment count, author, permalink, and creation timestamp. Most rows also carry the author's avatar at `author.avatar_url`, the post's attached media or link target at `content.media_urls`, and the upvote ratio, post flair and Reddit's own content language at `ext.upvote_ratio`, `ext.flair` and `ext.content_language`. `ext.upvote_ratio` and `ext.flair` come from the same source as the posts, so they are there whenever Reddit reports them. `author.avatar_url` and `ext.content_language` come from a second source that runs alongside the main one on PAGE ONE ONLY, so a walk past the first page returns the same posts in the same order without those two, and on a small share of first pages they are null across the whole page while every other field is unchanged. Treat those two as present-usually rather than guaranteed, and never as a signal about the post itself. `content.media_urls` on this surface is whatever the post points at, so on a link post it is the article or site the post links to rather than an image or a video. Page size varies with the subreddit and the sort and is not fixed: a busy community returns roughly 15 to 25 posts on the default sort. On `sort=top`, a SHORT window (`day`) is a full page and a LONG window (`year`) is the sparse one — measured 09/09/2026 on r/HouseOfTheDragon: all 22, day 22, week 19, month 10, year 3. Paginate with `after` rather than assuming a count. Ranking and row set are Reddit's own listing, unchanged by the enrichment.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_subreddit",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 1,
        "x-credit-cost-min": 1,
        "x-credit-cost-max": 5,
        "x-credit-cost-formula": "1 credit per page. The default labels (sponsored, intent, niche) are free. label=mention, quality, ai_style, ai_written, injection, or label=intent with offer=, holds 4 extra credits and refunds down to 1 credit per started 25 posts that were newly judged: posts already labelled are free, a page where nothing could be judged refunds the whole extra, and a cached page is free. With `max_pages`, `max_items` or `max_credits`, each page walked is billed at this price (a cached page is free), and `max_credits` caps the total.",
        "parameters": [
          {
            "name": "subreddit",
            "in": "query",
            "required": true,
            "description": "Subreddit name without the r/ prefix",
            "schema": {
              "type": "string"
            },
            "example": "technology"
          },
          {
            "name": "timeframe",
            "in": "query",
            "required": false,
            "description": "Timeframe to get posts from. Applied with sort=top (auto-selected when you omit sort).",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "day",
                "week",
                "month",
                "year"
              ]
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Sort order",
            "schema": {
              "type": "string",
              "enum": [
                "best",
                "hot",
                "new",
                "top",
                "rising"
              ]
            }
          },
          {
            "name": "after",
            "in": "query",
            "required": false,
            "description": "After to get more posts. Get 'after' from previous response. Native upstream cursor param. Send the universal `cursor` instead: the API maps it to this name for you.",
            "deprecated": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Set to true for a trimmed down version of the response. This also skips the enrichment pass, so `author.avatar_url`, `content.media_urls`, `flags.spoiler`, `post.url` and the `ext.*` fields are omitted along with the rest of the trimmed leaves.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "label",
            "in": "query",
            "required": false,
            "description": "Optional CSV of SocialCrawl labels to add to every post. Without this param every page already carries sponsored, intent and niche, free; label= adds the labels you name to them (the defaults keep running). sponsored, intent and niche are free when asked for too; mention, quality, ai_style, intent with offer=, and injection add 1 credit per started 25 newly judged posts. judgments=off (or label=none) turns the default labels off. sponsored: is the post a paid or gifted promotion (p, 0 to 1), did it carry a disclosure marker such as #ad or 광고 (disclosed), is it likely paid with no marker (undisclosed), and which of the accounts it mentions does it promote (brand, or null). These are signals to review, never a finding. mention (needs brand=): is the post about that brand rather than something that shares its name (about_brand, 0 to 1), how it feels about the brand on five levels (sentiment_level 0 to 4 and sentiment_score 0 to 1, null when the post is not about the brand), is it sarcastic, which aspect it talks about (taste_or_quality, price_or_value, availability_or_delivery, health_or_safety, advertising_or_campaign, customer_service, none), and did the author buy or use it (first_hand). intent: what the author is mainly doing (label: asking_for_recommendation, comparing_options, switching_away, complaining, promoting, news_or_discussion, other, or null when unsure, with confidence), whether they read as a potential buyer rather than a seller (buyer, seller), how pressing the need is (urgency, 0 to 3), and, when you pass offer=, whether your offer would plausibly help them (fits_offer). niche: which of the 33 niches of the published taxonomy sc-niche-v1 the caption belongs to, or personal_no_niche, or other (label, confidence, taxonomy), with label null when the caption is too thin to tell or the pick is unsure. It reads the caption only, not the video. quality: how much checkable detail the caption carries (fact_density 0 to 3), whether it mainly asks for likes, replies, shares, follows or tags (engagement_bait, 0 to 1), whether it is written to provoke anger as a way to get engagement (rage_bait, 0 to 1; about the writing, never the side taken), whether it only repeats someone else's news or view (secondhand, 0 to 1), and what the post is mainly doing (post_aim: inform, opinion, sell, entertain, provoke, other). exclude=engagement_bait drops posts whose engagement_bait is 0.8 or higher. ai_style: writing patterns common in AI-generated text, judged on the text alone. It does not say who wrote the post, and a person who writes in this style is flagged too. Six patterns are judged, each a probability (0 to 1): binary_contrast (\"This is not X. It's Y.\"), faux_insight (\"Here's what nobody tells you\" and throat-clearing openers), colon_reveal (\"The best part: it learns.\"), profound_kicker (ends on an aphorism or mic-drop line), puffery (\"marks a pivotal moment\", \"highlighting the importance of\") and rhetorical_setup (\"What if I told you\", a question the post answers itself, \"Not a X. Not a Y. A Z.\"). Four are counted in the text: slop_words (words and phrases such as delve, leverage, robust, game changer, at the end of the day), em_dashes, emoji_bullets (lines that start with an emoji or a symbol bullet) and one_line_paragraphs (paragraphs that are one short line). pattern_count is how many patterns are present (a judged pattern at 0.8 or higher, slop_words 1 or more, em_dashes 2 or more, emoji_bullets 2 or more, one_line_paragraphs 5 or more) and markers lists their names, comma-separated. A post with less than about eight words of text is only counted, with every judged pattern 0. The judged patterns read the first 400 and the last 150 characters of a long post, and the counts read the whole post. exclude=ai_style drops posts with 2 or more patterns. ai_written: how likely the post was written by an AI model, from SocialCrawl's own text classifier, reading the opening of the post (about 1,000 characters): p (0 to 1, calibrated), level (likely (p 0.95 or higher), possible (p 0.71 or higher) or unlikely) and model (the model name; a new name means a new scale). A post under 8 words is too short to read: p null, level too_short. It is a probability, not proof: a person can be flagged and an AI-written post can pass, and the shorter the post the less certain it is. exclude=ai_written drops likely posts. injection flags text that addresses an AI system and tries to direct it (flagged, p); it never drops or rewrites a row. A post that could not be judged carries labels: null. Posts already labelled for anyone are free, and so is a cached page. data.labels reports what was judged and billed.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "exclude",
            "in": "query",
            "required": false,
            "description": "Optional CSV (engagement_bait, ai_style, ai_written). engagement_bait, only with label=quality, drops posts whose engagement_bait probability is 0.8 or higher. ai_style, only with label=ai_style, drops posts that show 2 or more of its writing patterns (pattern_count 2 or higher). ai_written, only with label=ai_written, drops posts whose level is likely (p 0.95 or higher), or whose p reaches your ai_written_threshold; a post too short to read is never dropped. Dropped posts are listed in data.labels.dropped_ids. A post that could not be judged is never dropped.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ai_written_threshold",
            "in": "query",
            "required": false,
            "description": "Optional, only with label=ai_written and exclude=ai_written. The p (0 to 1) at which exclude=ai_written drops a post. Default 0.95 (level likely). 0.71 also drops possible posts: more AI posts go, and more posts by people with them.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "brand",
            "in": "query",
            "required": false,
            "description": "Required by label=mention, ignored otherwise. The brand or product the posts are judged against, up to 300 characters, for example brand=Buldak. Without it label=mention is skipped with the warning label_mention_needs_brand and is not billed.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "brand_description",
            "in": "query",
            "required": false,
            "description": "Optional, with label=mention. One plain sentence saying what the brand is, for example brand_description=Samyang's spicy instant noodle brand. Use it when the name is also an ordinary word or another company's name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offer",
            "in": "query",
            "required": false,
            "description": "Optional, with label=intent. One or two plain sentences saying what you sell, up to 300 characters, for example offer=A web design agency that builds websites for small businesses. Adds fits_offer to every post; without it fits_offer is null.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "judgments",
            "in": "query",
            "required": false,
            "description": "Optional, on (the default) or off. By default every row gains free SocialCrawl judgments (computed.labels, and computed.relevance on search endpoints), reported in data.labels (mode default) and data.relevance (origin default), each with a status (complete, partial or skipped) and pending: the rows still being judged when the page was sent, which carry null now and are filled on your next call or cached read. Default judgments never add credits, never change an existing field, and never drop or reorder a row. off returns the page exactly as before, with none of those keys. label=none does the same.",
            "schema": {
              "type": "string",
              "enum": [
                "on",
                "off"
              ]
            }
          },
          {
            "name": "dry_run",
            "in": "query",
            "required": false,
            "description": "Optional. When 1, return a cost preview for this labelled or relevance-filtered request without fetching the page or judging any row. data.estimate reports rows_expected, rows_cached, label_credits_min, label_credits_max and base_credits. 0 credits charged.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            }
          },
          {
            "name": "label_evidence",
            "in": "query",
            "required": false,
            "description": "Optional, only with label=. When 1, every labelled row also carries computed.labels_evidence.<preset> = { quote, sentence_index }: the sentence in the row that most clearly shows the label, copied verbatim. Absent or null when no single sentence shows it.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            }
          },
          {
            "name": "fit",
            "in": "query",
            "required": false,
            "description": "Optional. When goal, keep the rows and fields needed for the goal you pass in goal= (plus any that are uncertain, and the first and last), and replace the rest with a stub. data.held_back lists the held ids and a recall id that re-reads the full page from cache at no extra charge. Without this param the page is unchanged.",
            "schema": {
              "type": "string",
              "enum": [
                "goal"
              ]
            }
          },
          {
            "name": "goal",
            "in": "query",
            "required": false,
            "description": "Required by fit=goal. What you are trying to do, in your own words, up to 300 characters.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "fit_tokens",
            "in": "query",
            "required": false,
            "description": "Optional, only with fit=goal. Soft cap on how much of the page to keep, in tokens. Uncertain blocks and the first and last block are kept even if they exceed it.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Only rows published on or after this date: YYYY-MM-DD (midnight UTC) or an ISO 8601 timestamp. Rows older than it are left off the page, and the page that reaches one ends the walk: `next_cursor` is not returned and `pagination.stopped_at` is `since`. Sending it sets the newest-first sort shown in this endpoint's sort parameter (any other sort value is a free 400). The page still costs what a page costs, so you pay for the pages you walk and no more. A row with no date is kept. `published_after`, `start_date`, `from_date`, `publish_time` (`yesterday`, `this-week`, `this-month`, `last-3-months`, `last-6-months`) and `max_age_days` are accepted and applied as `since`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "until",
            "in": "query",
            "required": false,
            "description": "Only rows published on or before this date: YYYY-MM-DD (that whole UTC day is included) or an ISO 8601 timestamp. Newer rows are left off each page and the walk does not stop, so older pages follow. A row with no date is kept. `published_before`, `end_date` and `to_date` are accepted and applied as `until`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_pages",
            "in": "query",
            "required": false,
            "description": "1 to 50 (default 1, or 50 when `max_items` or `max_credits` is sent). Walk up to this many pages in one call and return the rows from all of them. Each page walked is billed exactly as one call to this endpoint (a cached page is free) and counts against your rate limit; its charge and any refund are recorded under the page's own request id, listed in `data.walk.request_ids`. The walk stops early at the last page, or when the request's time budget runs low; `data.walk.stopped` says why (`end`, `max_pages`, `max_items`, `max_credits`, `time_budget`, `page_error`) and `pagination.next_cursor` continues from where it stopped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "max_items",
            "in": "query",
            "required": false,
            "description": "1 to 5000. Get more in one call: keep walking pages until the response holds at least this many rows, then stop with `data.walk.stopped: \"max_items\"`. The last page is returned whole (it was billed), so `data.items` can hold up to one page more than this, and `pagination.next_cursor` resumes right after it without skipping a row. Walks up to 50 pages unless `max_pages` says fewer; each page is billed as one call (a cached page is free). Add `max_credits` to cap the spend. A long walk can stop on the time budget first (`\"time_budget\"`): send the returned cursor with the same params to continue.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "max_credits",
            "in": "query",
            "required": false,
            "description": "1 to 100000. The most this call may spend, across every page it walks. A page starts only while the credits already spent plus that page's price (or, when higher, the most any page of this walk has cost) still fit, so the call never goes past it; the walk then stops with `data.walk.stopped: \"max_credits\"` and the cursor to resume. Sent alone, it walks as far as the budget goes (up to 50 pages). A value below the price of one page is a free 400 whose `error.details.page_credits` names that price. Credits a row join (`include=`) adds are known only once a page has run, so page 1 is checked against its own price.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Universal pagination cursor. Send `pagination.next_cursor` from the previous response back verbatim: the API maps it to this endpoint's native `after` (cursor style). You never construct, decode, or look up a cursor. Omit it for page 1.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/subreddit"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of canonical post wrappers ({ post, computed })",
                          "items": {
                            "type": "object",
                            "description": "Canonical post wrapper",
                            "properties": {
                              "post": {
                                "type": "object",
                                "description": "Canonical Post object (unified across all platforms)",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "Platform-specific post ID (always a string; numeric upstream IDs are stringified)"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Direct URL to the post on the source platform"
                                  },
                                  "content": {
                                    "type": "object",
                                    "description": "Post content fields (text, media, thumbnail, duration)",
                                    "properties": {
                                      "text": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Post caption, description, or text content"
                                      },
                                      "media_urls": {
                                        "type": [
                                          "string",
                                          "array",
                                          "null"
                                        ],
                                        "description": "URL(s) of the primary media. Single string for video/photo posts; array of strings for carousels.",
                                        "items": {
                                          "type": "string",
                                          "description": "URL(s) of the primary media. Single string for video/photo posts; array of strings for carousels."
                                        }
                                      },
                                      "thumbnail_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "URL to thumbnail image"
                                      },
                                      "duration_seconds": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Video/clip duration in seconds (null for non-video posts)"
                                      }
                                    }
                                  },
                                  "author": {
                                    "type": "object",
                                    "description": "Subset of Author fields for the post creator",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Author username"
                                      },
                                      "display_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Author display name"
                                      },
                                      "avatar_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "URL to author profile picture"
                                      },
                                      "verified": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Whether the author account is verified"
                                      }
                                    }
                                  },
                                  "engagement": {
                                    "type": "object",
                                    "description": "Engagement counts",
                                    "properties": {
                                      "views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "View count (if available). For Instagram video/reels this is the play count: the headline 'Views' the IG app shows. Instagram removed per-post play counts from its public web pages in August 2026, so `GET /v1/instagram/post` now fills the count automatically from a second source within the same call: videos and reels keep a numeric `views` with no extra endpoint or workaround. Note: since mid-July 2026 Instagram's play count is Instagram-only. It no longer includes Facebook crosspost views (Meta-side change; the app UI changed identically). For combined reach, also fetch the Facebook crosspost via `/v1/facebook/post`."
                                      },
                                      "likes": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Like / reaction count"
                                      },
                                      "comments": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Comment count. Note: on `GET /v1/instagram/post` this is Instagram's `edge_media_to_parent_comment.count` (top-level comments); the IG list endpoints report the mobile `comment_count` total (includes replies). Both land on this same field."
                                      },
                                      "shares": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Share / repost / retweet count. On Instagram this is `reshare_count` (the paper-plane Share / Send count) and it exists only on Instagram's mobile surface, so it is returned by `/v1/instagram/post/stats`, `/v1/instagram/profile/reels/full`, and `/v1/instagram/profile/posts/full`. The web-sourced Instagram list and search endpoints return `null` (never fabricated)."
                                      },
                                      "saves": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Save / bookmark count. `null` on Instagram: the save count is platform-private and Instagram exposes no numeric save metric on any surface (never fabricated)."
                                      }
                                    }
                                  },
                                  "flags": {
                                    "type": "object",
                                    "description": "Boolean flags on the post",
                                    "properties": {
                                      "nsfw": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "NSFW flag (null when platform does not surface)"
                                      },
                                      "spoiler": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Spoiler flag (null when platform does not surface)"
                                      },
                                      "pinned": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Pinned-to-profile flag (null when platform does not surface)"
                                      },
                                      "deleted": {
                                        "type": "boolean",
                                        "description": "Whether the post is tombstoned (always present)"
                                      },
                                      "likes_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Present and `true` when the creator has hidden the like count. `engagement.likes` is `null` in that case (never the platform's decoy preview number). Absent on normal posts."
                                      },
                                      "comments_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Present and `true` when the upstream reports the comment count as hidden. `engagement.comments` is `null` in that case. Absent on normal posts."
                                      },
                                      "shares_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.shares_hidden"
                                      },
                                      "views_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.views_hidden"
                                      },
                                      "saves_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.saves_hidden"
                                      }
                                    }
                                  },
                                  "published_at": {
                                    "type": [
                                      "string",
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Post creation timestamp as an ISO 8601 UTC string. When the upstream sent a Unix epoch it is converted here and the raw epoch is preserved under `post.ext.published_at_epoch` for one deprecation cycle."
                                  },
                                  "ext": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Platform-specific passthrough fields for cross-endpoint chains (present only on platforms that surface them)",
                                    "properties": {
                                      "music_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok music/clip id (exact string): pass to `/v1/tiktok/song/videos?clipId=` to find videos using the same sound"
                                      },
                                      "matched_song_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The catalogue song TikTok matched the video's sound to, as an exact digit string. An official clip and the original sounds creators upload with it have different `music_id` values and the same `matched_song_id`, so group rows on it to count every use of one song. It is not a clipId: `/v1/tiktok/song` and `/v1/tiktok/song/videos` do not accept it. `/v1/tiktok/search/music` carries it on each sound, so a search on the song's title and artist, kept to the sounds with the same `matched_song_id`, gives the song's official sounds and their `video_count`. Absent when TikTok matched the sound to no song, and on rows served from a source that does not report the match."
                                      },
                                      "matched_song_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The title of the song in `matched_song_id`. Absent when there is no matched song."
                                      },
                                      "matched_song_artist": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The artist of the song in `matched_song_id`, as TikTok's catalogue names it. Absent when there is no matched song."
                                      },
                                      "music_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The title of the video's own sound (`music_id`). An uploaded sound is titled like `original sound - <handle>`; the song it plays, when TikTok recognised one, is `matched_song_title`."
                                      },
                                      "music_artist": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The artist TikTok shows for the video's own sound. On an original sound this is the uploader's display name, not the song's artist; use `matched_song_artist` for that."
                                      },
                                      "music_is_original": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "TikTok only. `true` when the video's sound is an original sound a creator uploaded, `false` when it is a catalogue track. Absent when the source does not say."
                                      },
                                      "author_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The creator's platform-native numeric user id. On TikTok search and list items, pass to `/v1/tiktok/profile?user_id=` for the creator's current follower count (survives username changes). On Instagram `/v1/instagram/search/reels`, `/v1/instagram/search/hashtag` and `/v1/instagram/location/posts` items it is present on every row, accepted by `/v1/instagram/profile/country?user_id=` and `/v1/instagram/basic-profile?userId=`. On Facebook it appears when the upstream exposed a numeric actor id and no real handle."
                                      },
                                      "author_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The posting account's profile URL, so a matching post can be followed to its account. Present on `/v1/facebook/search/posts` rows: the vanity or `/people/<name>/<id>/` URL when Facebook sends one, otherwise `https://www.facebook.com/profile.php?id=<numeric id>` built from the account id. Pass it as `url` to `/v1/facebook/profile` (or to `/v1/prism/profiles` with `platform: facebook`). Null when the row names neither an account URL nor a numeric account id. Absent on other endpoints."
                                      },
                                      "author_followers": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The creator's follower count as embedded in the search payload itself, when the search source happens to carry one. On Instagram `search/reels` it is null on a plain call, because Instagram stopped sending follower counts in its search payload in August 2026; send `include=creator` (or `country`) and it is filled from the creator's profile, 2 credits per creator looked up. It stays null when that lookup does not resolve."
                                      },
                                      "author_following": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.author_following"
                                      },
                                      "author_posts_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.author_posts_count"
                                      },
                                      "author_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The free text the author wrote in their profile's location field, exactly as written (for example `Johannesburg, South Africa`). It is not a country code and is not checked. Present on X tweet and reply rows; null or absent when the author left it blank."
                                      },
                                      "in_reply_to_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.in_reply_to_id"
                                      },
                                      "in_reply_to_username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.in_reply_to_username"
                                      },
                                      "conversation_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.conversation_id"
                                      },
                                      "author_country": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The creator's country. On Instagram it is the country the creator declares on the About this account panel, as a country name (for example `Spain`), and it is not where the post was filmed. It is present on `/v1/instagram/search/reels` when the request sends `include=creator`, `include=country` or `country`, and on `/v1/instagram/search/hashtag` and `/v1/instagram/location/posts` when it sends `include=country`, filled by looking the creator up. On YouTube rows joined with `include=channel` it is the channel's own country as an ISO 3166-1 alpha-2 code (for example `ZA`). Null when the platform publishes no country for the creator or the lookup did not resolve, and nothing is guessed; absent on a plain call."
                                      },
                                      "author_public_email": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The public contact email on the creator's profile. Present only on `/v1/instagram/search/reels` when the request sends `include=creator`, filled by looking the creator up. Null when the creator lists no public email or the lookup did not resolve; absent on a plain call."
                                      },
                                      "author_public_phone": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The public contact phone number on the creator's profile. Present only on `/v1/instagram/search/reels` when the request sends `include=creator`, filled by looking the creator up. Null when the creator lists no public phone or the lookup did not resolve; absent on a plain call."
                                      },
                                      "download_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "How many times the video has been saved to a device. TikTok only, and distinct from `engagement.saves`: a save keeps the video in a private collection on the platform, a download takes a copy off it, and TikTok counts the two separately. Present on TikTok post, search and post-list responses; absent everywhere else."
                                      },
                                      "region": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only: the country TikTok registers the video to, as an ISO 3166-1 alpha-2 code (normally the creator's account country when they posted). It is not the viewer's country, not the `region` you requested, and not a language. On `/v1/tiktok/trending`, `/v1/tiktok/search`, `/v1/tiktok/search/top`, `/v1/tiktok/profile/videos`, `/v1/tiktok/search/hashtag` and `/v1/tiktok/song/videos` it is how you tell which rows are from a given country: filter on it when you need only that country. A row whose source omits the country stays null. The `region` request parameter still only sets the proxy."
                                      },
                                      "subreddit": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Reddit subreddit name (search/list items): pass to `/v1/reddit/subreddit/details?subreddit=`"
                                      },
                                      "title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.title"
                                      },
                                      "selftext": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.selftext"
                                      },
                                      "upvote_ratio": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Reddit only: the share of a post's votes that are upvotes, as a fraction from 0 to 1 and usually close to 1 (six live rows measured 1, 1, 1, 0.86, 0.75, 1). Fractional despite the integer type this schema emits for every numeric leaf, the same caveat as `author.ext.average_rating`. Populated on `/v1/reddit/search` rows whose source carries it, and null everywhere else on Reddit including `/v1/reddit/post` and `/v1/reddit/subreddit`."
                                      },
                                      "flair": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.flair"
                                      },
                                      "content_language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The language the platform itself tags the post with, when it sends one: Reddit's own language tag on Reddit lanes, and TikTok's caption-language tag (for example `de`) on `/v1/tiktok/trending?feed=local`. Null when the platform could not tell (Reddit `und`, TikTok `un`, common on short or emoji-only captions); absent where the source sends no tag. Never inferred from the text by us: that is `post.computed.language`."
                                      },
                                      "type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.type"
                                      },
                                      "content_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.content_type"
                                      },
                                      "ticker_symbols": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.ticker_symbols",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.ticker_symbols"
                                        }
                                      },
                                      "video_view_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram's legacy 3-second-view count. Historical: Instagram stopped serving it in August 2026 (removed from its web post surface along with the web play count), so fresh `/v1/instagram/post` lookups no longer carry it and no source can restore it. Use `engagement.views` (the play count) instead."
                                      },
                                      "ig_play_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram-only play count (`ig_play_count`). Since mid-July 2026 Instagram's headline play count (`engagement.views`) no longer includes Facebook crosspost views and equals this value; it is surfaced explicitly so you can tell the Instagram-only figure apart and detect any future re-divergence. For combined Instagram + Facebook reach, also fetch the Facebook crosspost via `/v1/facebook/post`. Present on `/v1/instagram/post/stats` and, since the August 2026 views fix, on `/v1/instagram/post` for video posts."
                                      },
                                      "repost_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.repost_count"
                                      },
                                      "media_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.media_type"
                                      },
                                      "text_truncated": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.text_truncated"
                                      },
                                      "ip_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.ip_location"
                                      },
                                      "carousel_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.carousel_count"
                                      },
                                      "remix_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.remix_count"
                                      },
                                      "audio_cluster_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Instagram's audio cluster for a reel, as an exact digit string: the id Instagram uses to group different uploads of the same sound. Present on `/v1/instagram/audio/reels` rows and on `/v1/instagram/profile/reels` with `include=stats`; absent on a row when it is not available and on every other surface."
                                      },
                                      "facebook_likes": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post share that was EXCLUDED from `engagement.likes` on this row. A post shared to Facebook arrives from some sources with its Facebook likes already folded into the Instagram count, so the share is subtracted and published here, which keeps `engagement.likes` the Instagram-only figure instagram.com shows on the post. Add the two together for the combined number. Absent when the read carried no Facebook share, and absent on a post whose owner hides the like count, because nothing can be subtracted from a null. A response that excluded a share also carries a note in `data._warnings`."
                                      },
                                      "facebook_comments": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post share that was EXCLUDED from `engagement.comments` on this row, the comment counterpart of `post.ext.facebook_likes`. Each leaf appears only for the count it actually changed, so a post whose likes are hidden but whose comments were reconciled carries this one alone."
                                      },
                                      "instagram_views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Instagram-only play count of a video, the same figure on every Instagram endpoint. `engagement.views` keeps each endpoint's established meaning: on `/v1/instagram/profile/reels`, `/v1/instagram/audio/reels`, `/v1/instagram/search/reels` and `/v1/instagram/search/hashtag` it can include the post's Facebook cross-post views, while on `/v1/instagram/post` and `/v1/instagram/post/stats` it is Instagram-only. Read this leaf when you compare one post across endpoints. Absent on photos and when the source did not report the Instagram-only figure."
                                      },
                                      "facebook_views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post part of a video's play count, the counterpart of `post.ext.instagram_views`. Present only when the source reported the Facebook part, or a combined total above the Instagram figure. Absent does not mean zero: some sources report the Instagram figure alone even for a cross-posted video."
                                      },
                                      "published_at_epoch": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Raw Unix epoch for `published_at` (seconds, or milliseconds when the upstream sent millis). Present only when the upstream sent a numeric epoch that was normalised to the ISO 8601 `published_at` string. Kept for one deprecation cycle for integrations pinned to the numeric form."
                                      },
                                      "usertags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.usertags",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.usertags"
                                        }
                                      },
                                      "coauthors": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram collaborative posts (the native \"Collab\" feature). The full list of co-author accounts on the post, as `{ id, username, full_name, is_verified, profile_pic_url }`. A collab post has ONE producer and appears in every co-author's grid, so `post.author` is whichever account created it, which is not necessarily the profile you queried. The complete set of accounts on a post is `post.author.username` plus every `username` in this array. An empty array means Instagram reports the post as NOT a collab; the field is absent on surfaces that carry no co-author signal, including `/v1/instagram/post` (its web source ships the field permanently empty, so use `/v1/instagram/post/stats` for a single post).",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram collaborative posts (the native \"Collab\" feature). The full list of co-author accounts on the post, as `{ id, username, full_name, is_verified, profile_pic_url }`. A collab post has ONE producer and appears in every co-author's grid, so `post.author` is whichever account created it, which is not necessarily the profile you queried. The complete set of accounts on a post is `post.author.username` plus every `username` in this array. An empty array means Instagram reports the post as NOT a collab; the field is absent on surfaces that carry no co-author signal, including `/v1/instagram/post` (its web source ships the field permanently empty, so use `/v1/instagram/post/stats` for a single post)."
                                        }
                                      },
                                      "music": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.music"
                                      },
                                      "sponsor_tags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram only: the brand accounts the post tags as its paid partner, as usernames (`[\"rolex\"]`). `[]` on a post with no partner tagged. Present on `/v1/instagram/post/stats`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram only: the brand accounts the post tags as its paid partner, as usernames (`[\"rolex\"]`). `[]` on a post with no partner tagged. Present on `/v1/instagram/post/stats`; absent on every other endpoint."
                                        }
                                      },
                                      "sponsored_disclosed": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "The platform's own disclosure that the post is paid or promotional: on Instagram the paid-partnership label (`is_paid_partnership`) or a tagged brand partner, on TikTok the label TikTok shows viewers (\"Paid partnership\", \"Commission paid\", \"Promotional content\"). `false` when the post carries the flag unset, null when it carries none. Present on `/v1/instagram/post/stats`, `/v1/instagram/search/reels` and `/v1/tiktok/search`; absent on every other endpoint."
                                      },
                                      "ai_label": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Instagram only: Instagram's AI-content label on the post, as the method Instagram reports: `classifier_score_high` (Instagram detected it, shown as \"Likely made with AI\"), `ai_created` or `ai_edited` (declared or detected as made or edited with AI). Null when the post carries no AI label. Present on `/v1/instagram/post/stats`; absent on every other endpoint."
                                      },
                                      "story_mentions": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: the accounts the story mentions with a mention sticker, as usernames in alphabetical order. `[]` when it mentions nobody. Present on `/v1/instagram/stories`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: the accounts the story mentions with a mention sticker, as usernames in alphabetical order. `[]` when it mentions nobody. Present on `/v1/instagram/stories`; absent on every other endpoint."
                                        }
                                      },
                                      "story_links": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: where the story's link stickers lead, as URLs in alphabetical order. Instagram wraps each link in its own redirect with a per-view click id; both are removed, so this is the destination itself. `[]` when the story has no link sticker. Present on `/v1/instagram/stories` and `/v1/instagram/highlight/detail`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: where the story's link stickers lead, as URLs in alphabetical order. Instagram wraps each link in its own redirect with a per-view click id; both are removed, so this is the destination itself. `[]` when the story has no link sticker. Present on `/v1/instagram/stories` and `/v1/instagram/highlight/detail`; absent on every other endpoint."
                                        }
                                      },
                                      "story_reshared_posts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: the feed posts the story reshares, as post URLs (`https://www.instagram.com/p/{shortcode}/`, which `/v1/instagram/post` takes). `[]` when it reshares none. Present on `/v1/instagram/stories`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: the feed posts the story reshares, as post URLs (`https://www.instagram.com/p/{shortcode}/`, which `/v1/instagram/post` takes). `[]` when it reshares none. Present on `/v1/instagram/stories`; absent on every other endpoint."
                                        }
                                      },
                                      "location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.location"
                                      },
                                      "media": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.media",
                                        "items": {
                                          "type": "object",
                                          "description": "Nested object: post.ext.media",
                                          "properties": {
                                            "type": {
                                              "type": "string",
                                              "description": "Leaf at post.ext.media.type"
                                            },
                                            "url": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.media.url"
                                            },
                                            "width": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.media.width"
                                            },
                                            "height": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.media.height"
                                            }
                                          }
                                        }
                                      },
                                      "top_comments": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.top_comments",
                                        "items": {
                                          "type": "object",
                                          "description": "Nested object: post.ext.top_comments",
                                          "properties": {
                                            "id": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.id"
                                            },
                                            "text": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.text"
                                            },
                                            "username": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.username"
                                            },
                                            "likes": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.top_comments.likes"
                                            },
                                            "published_at": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.published_at"
                                            }
                                          }
                                        }
                                      },
                                      "hashtags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.hashtags",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.hashtags"
                                        }
                                      },
                                      "mentions": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.mentions",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.mentions"
                                        }
                                      },
                                      "mentioned_user_ids": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.mentioned_user_ids",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.mentioned_user_ids"
                                        }
                                      },
                                      "quoted_post": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Threads quote posts: the post this one quotes, as `{ id, url, author: { id, username }, text, media_urls, thumbnail_url }`. A quote post usually carries no caption or media of its own, and the text and video you see on the post's page belong to this attachment, by a different author. It is returned here rather than merged into `post.content`, so `content.*` always stays the outer post's own content and one account's media is never attributed to another. Absent on posts that are not quote posts."
                                      },
                                      "retweeted_post": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.retweeted_post"
                                      },
                                      "quote_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.quote_count"
                                      },
                                      "all_media_urls": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.all_media_urls",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.all_media_urls"
                                        }
                                      },
                                      "reaction_counts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.reaction_counts",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.reaction_counts"
                                        }
                                      },
                                      "share_urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.share_urn"
                                      },
                                      "post_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.post_type"
                                      },
                                      "activity_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.activity_id"
                                      },
                                      "published_at_precision": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.published_at_precision"
                                      },
                                      "author_urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_urn"
                                      },
                                      "author_headline": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_headline"
                                      },
                                      "author_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_type"
                                      },
                                      "is_repost_quote": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.is_repost_quote"
                                      },
                                      "article": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.article"
                                      },
                                      "reaction_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.reaction_type"
                                      },
                                      "download_media_urls": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.download_media_urls",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.download_media_urls"
                                        }
                                      },
                                      "tags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.tags",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.tags"
                                        }
                                      },
                                      "categoryId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.categoryId"
                                      },
                                      "categoryTitle": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.categoryTitle"
                                      },
                                      "topicCategories": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.topicCategories",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.topicCategories"
                                        }
                                      },
                                      "duration": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.duration"
                                      },
                                      "license": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.license"
                                      },
                                      "madeForKids": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.madeForKids"
                                      },
                                      "defaultAudioLanguage": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.defaultAudioLanguage"
                                      },
                                      "hasPaidProductPlacement": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.hasPaidProductPlacement"
                                      },
                                      "caption": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.caption"
                                      },
                                      "position": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.position"
                                      },
                                      "playlistId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlistId"
                                      },
                                      "videoOwnerChannelId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.videoOwnerChannelId"
                                      },
                                      "videoPublishedAt": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.videoPublishedAt"
                                      },
                                      "description": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.description"
                                      },
                                      "default_language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.default_language"
                                      },
                                      "localizations": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.localizations"
                                      },
                                      "playlist_item_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_item_id"
                                      },
                                      "playlist_owner_channel_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_owner_channel_id"
                                      },
                                      "playlist_owner_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_owner_title"
                                      },
                                      "channel_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.channel_id"
                                      },
                                      "published_label": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.published_label"
                                      },
                                      "published_precision": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.published_precision"
                                      },
                                      "title_maybe_translated": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.title_maybe_translated"
                                      },
                                      "video_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.video_count"
                                      },
                                      "posts_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "`/v1/instagram/hashtag` only: the exact number of public posts Instagram counts under the hashtag. Live: it moves between calls minutes apart."
                                      },
                                      "commerce": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.commerce"
                                      },
                                      "on_screen_texts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.on_screen_texts",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.on_screen_texts"
                                        }
                                      },
                                      "topic_tag": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.topic_tag"
                                      },
                                      "reshare_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.reshare_count"
                                      },
                                      "dsp_ids": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.dsp_ids"
                                      },
                                      "topic_tag_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.topic_tag_id"
                                      },
                                      "amazon_shop_lists": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_lists",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_lists"
                                        }
                                      },
                                      "amazon_shop_trending_picks": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_trending_picks",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_trending_picks"
                                        }
                                      },
                                      "amazon_shop_curations": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_curations",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_curations"
                                        }
                                      },
                                      "amazon_shop_socials": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_socials",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.amazon_shop_socials"
                                        }
                                      },
                                      "ad": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Ad Library envelope (Facebook `adlibrary/ad` and `adlibrary/company/ads` items): page_id, currency, spend, reach_estimate, publisher_platforms, categories, targeted_or_reached_countries, cta_text, cta_type, link_url, is_active, end_date_iso, display_format, title, video_hd_url, video_sd_url. Absent on every non-ad surface."
                                      },
                                      "apple_music": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.apple_music"
                                      },
                                      "feedback_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.feedback_id"
                                      },
                                      "question_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN (`/v1/naver/kin/search`) only: the question's id (Naver's `docId`), read from the row's link. Kin returns one row per answer, so several rows can share it; send `group=question` for one row per question."
                                      },
                                      "answer_no": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN only: which answer of the question this row is (Naver's `answerNo`), read from the row's link."
                                      },
                                      "answer_nos": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN with `group=question` only: every answer number of the question that was on the page, best-ranked first.",
                                        "items": {
                                          "type": "integer",
                                          "description": "Naver KnowledgeiN with `group=question` only: every answer number of the question that was on the page, best-ranked first."
                                        }
                                      },
                                      "published_at_est": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN only: the question's date ESTIMATED from its id (`YYYY-MM-DD`, Korea time), never a published date, so `published_at` stays null. Absent for questions older than the calibration table."
                                      },
                                      "date_basis": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "How `post.ext.published_at_est` was derived. `kin_docid_estimate`: interpolated from the question id against question pages whose posted date was read."
                                      },
                                      "event": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.event"
                                      },
                                      "trend": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Trend-board envelope: what TikTok's own trend board says about the row. On `/v1/tiktok/hashtags/popular`: `rank`, `country_code`, `period_days`, `posts` and `views` for the window (not lifetime totals), `industry` / `industry_id` / `industry_label` for the first board the hashtag was read from (null for the overall board), `boards` listing EVERY board it ranks on as `{ industry, industry_id, industry_label, rank }` in board order (so a hashtag in the top 3 overall and on an industry board shows both), `popularity_curve` as `{ date, value }` with value 0 to 100 relative to the window's peak, and `top_creators`. On `/v1/tiktok/videos/popular`: `rank`, `country_code`, `period_days`, `order_by`, `period_views`, `organic_views`, `engagement_rate`, `six_second_view_through_rate`, `content_tags`. Absent on every non-board surface."
                                      },
                                      "updated_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.updated_at"
                                      },
                                      "alt_text": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.alt_text"
                                      },
                                      "board_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.board_name"
                                      }
                                    }
                                  }
                                }
                              },
                              "computed": {
                                "type": "object",
                                "description": "Server-computed analytics fields (consistent across platforms)",
                                "properties": {
                                  "engagement_rate": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Computed engagement rate (0..1). Null when the upstream lacks enough signal."
                                  },
                                  "language": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "ISO 639-1 language code detected from the post text. Null when undetectable."
                                  },
                                  "content_category": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Keyword-classified content category (e.g. tech, food, gaming). Null when undetectable."
                                  },
                                  "estimated_reach": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Estimated reach based on views or follower count. Null when uncomputable."
                                  },
                                  "save_rate": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Numeric at computed.save_rate"
                                  },
                                  "relevance": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Nested object: computed.relevance",
                                    "properties": {
                                      "p": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.p"
                                      },
                                      "sense": {
                                        "type": "string",
                                        "description": "Leaf at computed.relevance.sense"
                                      },
                                      "depth": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.depth"
                                      },
                                      "spam": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.spam"
                                      }
                                    }
                                  },
                                  "labels": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Leaf at computed.labels"
                                  },
                                  "labels_evidence": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Leaf at computed.labels_evidence"
                                  }
                                }
                              }
                            }
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "reddit",
                  "endpoint": "/v1/reddit/subreddit",
                  "data": {
                    "items": [
                      {
                        "post": {
                          "id": "1wv1j68",
                          "url": "https://www.reddit.com/r/technology/comments/1wv1j68/nyc_is_now_the_first_city_in_america_that_bans/",
                          "content": {
                            "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                            "media_urls": "https://www.theverge.com/policy/1003426/nyc-click-to-cancel-subscriptions-rule",
                            "thumbnail_url": "https://external-preview.redd.it/5UgP2gtco5HmO0uATfi1lCcdDsn8dA3p6mGzdJ0y7WY.jpeg?auto=webp&s=05c3271c6d2db98f375d857122188a6f6d644103",
                            "duration_seconds": null
                          },
                          "author": {
                            "username": "user_6c31c8",
                            "display_name": "user_042bf4",
                            "avatar_url": "https://example.com/avatars/user_316731.png",
                            "verified": null
                          },
                          "engagement": {
                            "views": null,
                            "likes": 20137,
                            "comments": 408,
                            "shares": null,
                            "saves": null
                          },
                          "flags": {
                            "nsfw": false,
                            "spoiler": false,
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2026-10-01T14:53:16.000Z",
                          "ext": {
                            "subreddit": "technology",
                            "title": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                            "selftext": null,
                            "upvote_ratio": 0.9790215203591888,
                            "flair": "Business",
                            "content_language": "en",
                            "published_at_epoch": 1790866396
                          }
                        },
                        "computed": {
                          "engagement_rate": null,
                          "language": "en",
                          "content_category": "other",
                          "estimated_reach": null,
                          "labels": {
                            "sponsored": {
                              "p": 0.01,
                              "disclosed": false,
                              "undisclosed": false,
                              "brand": null
                            },
                            "intent": {
                              "label": "news_or_discussion",
                              "confidence": 1,
                              "buyer": false,
                              "seller": 0.03,
                              "fits_offer": null,
                              "urgency": 0.08
                            },
                            "niche": {
                              "label": "news_politics",
                              "confidence": 0.94,
                              "taxonomy": "sc-niche-v1"
                            }
                          }
                        }
                      },
                      {
                        "post": {
                          "id": "1wvdokm",
                          "url": "https://www.reddit.com/r/technology/comments/1wvdokm/usps_is_turning_mail_trucks_into_rolling/",
                          "content": {
                            "text": "Sample comment text (redacted).",
                            "media_urls": "https://www.gadgetreview.com/usps-is-turning-mail-trucks-into-rolling-surveillance-cameras",
                            "thumbnail_url": "https://external-preview.redd.it/uUkVrnXbdIhZ2hJQmADeeA-BGI0w75pMnPAlMWYvVjQ.jpeg?auto=webp&s=c6409322501a707a86c4074105493e80a9ed2ced",
                            "duration_seconds": null
                          },
                          "author": {
                            "username": "user_fc0282",
                            "display_name": "user_4db8b5",
                            "avatar_url": "https://example.com/avatars/user_bef523.png",
                            "verified": null
                          },
                          "engagement": {
                            "views": null,
                            "likes": 2689,
                            "comments": 116,
                            "shares": null,
                            "saves": null
                          },
                          "flags": {
                            "nsfw": false,
                            "spoiler": false,
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2026-10-01T22:48:56.000Z",
                          "ext": {
                            "subreddit": "technology",
                            "title": "Sample comment text (redacted).",
                            "selftext": null,
                            "upvote_ratio": 0.9731951393852752,
                            "flair": "Privacy",
                            "content_language": "en",
                            "published_at_epoch": 1790894936
                          }
                        },
                        "computed": {
                          "engagement_rate": null,
                          "language": "en",
                          "content_category": "other",
                          "estimated_reach": null,
                          "labels": {
                            "sponsored": {
                              "p": 0.02,
                              "disclosed": false,
                              "undisclosed": false,
                              "brand": null
                            },
                            "intent": {
                              "label": "news_or_discussion",
                              "confidence": 1,
                              "buyer": false,
                              "seller": 0.04,
                              "fits_offer": null,
                              "urgency": 0.24
                            },
                            "niche": {
                              "label": "news_politics",
                              "confidence": 0.72,
                              "taxonomy": "sc-niche-v1"
                            }
                          }
                        }
                      }
                    ],
                    "next_cursor": "t3_1wv1lx4",
                    "total": null,
                    "labels": {
                      "presets": [
                        "sponsored",
                        "intent"
                      ],
                      "rows": 15,
                      "labelled": 13,
                      "cached": 13,
                      "skipped": 0,
                      "unjudged": 0,
                      "dropped": 0,
                      "dropped_ids": [],
                      "extra_credits": 0,
                      "methodology_version": "labels/1",
                      "mode": "default",
                      "status": "partial",
                      "pending": 2,
                      "pending_ids": [
                        "1wvh7tk",
                        "1wvhnn3"
                      ]
                    },
                    "dropped": 0
                  },
                  "credits_used": 1,
                  "request_id": "req_example000000",
                  "cached": false,
                  "pagination": {
                    "next_cursor": "sc.eyJ2IjoyLCJjIjoidDNfMXd2MWx4NCIsImUiOiJyZWRkaXQvc3VicmVkZGl0IiwicCI6ImFmdGVyIn0",
                    "has_more": true,
                    "page_size": 15
                  },
                  "credits_remaining": 9999,
                  "source": "captured",
                  "captured_at": "2026-10-02T07:26:00.602Z",
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/reddit/subreddit/details": {
      "get": {
        "summary": "Get Reddit subreddit details",
        "description": "Returns detailed information about a subreddit including the subscriber count at `author.followers`, weekly active users and weekly contributions at `author.ext.weekly_active_users` and `author.ext.weekly_contributions`, the description, creation date, rules, and subreddit icon URL. The subscriber count and Reddit's own community language tag at `author.ext.language` come from a second source that runs only when the main one leaves the count empty, so on a small share of calls they are null while every other field is unchanged. The name can be sent in any casing: `askreddit` is resolved to Reddit's own spelling `AskReddit` and returns the whole object.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_subreddit_details",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 1,
        "x-socialcrawl-oneOf": [
          [
            "subreddit",
            "url"
          ]
        ],
        "parameters": [
          {
            "name": "subreddit",
            "in": "query",
            "required": false,
            "description": "Subreddit name without the r/ prefix, in any casing (e.g. `AskReddit` or `askreddit`). (one of: subreddit, url; at least one required)",
            "schema": {
              "type": "string"
            },
            "example": "AskReddit"
          },
          {
            "name": "url",
            "in": "query",
            "required": false,
            "description": "Subreddit URL (one of: subreddit, url; at least one required)",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/subreddit/details"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Platform-specific user ID (always a string; platform-specific prefixes like `did:`, `spotify:artist:`, `t2_` are stripped)"
                        },
                        "username": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "User handle or username"
                        },
                        "display_name": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Display name or full name"
                        },
                        "avatar_url": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "URL to profile picture"
                        },
                        "bio": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Profile biography or description"
                        },
                        "verified": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Whether the account is verified"
                        },
                        "followers": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Follower or subscriber count as an integer. Exact on Instagram and on TikTok when the source exposes an unrounded figure. YouTube above 1,000 subscribers is YouTube's published three-significant-figure figure. When the integer is a published/rounded value, `author.ext.followers_approximate` is true."
                        },
                        "following": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Number of accounts followed"
                        },
                        "posts_count": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of posts / videos / tracks / episodes"
                        },
                        "likes_count": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total likes received across the author's content (when surfaced)"
                        },
                        "url": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Direct URL to the profile page"
                        },
                        "location": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "ISO region code (e.g. `US`) or freeform location string when surfaced"
                        },
                        "external_url": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Bio link / external website URL when surfaced by the platform"
                        },
                        "private": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Boolean at author.private"
                        },
                        "joined_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "String at author.joined_at"
                        },
                        "last_post_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "String at author.last_post_at"
                        },
                        "ext": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Nested object: author.ext",
                          "properties": {
                            "social_context": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.social_context"
                            },
                            "account_created": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.account_created"
                            },
                            "country": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.country"
                            },
                            "country_name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.country_name"
                            },
                            "collects_received": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.collects_received"
                            },
                            "former_usernames": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.former_usernames",
                              "items": {
                                "type": "string",
                                "description": "String at author.ext.former_usernames"
                              }
                            },
                            "former_usernames_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Instagram profile/about: how many former usernames Instagram's \"About this account\" panel lists for the account. 0 when the panel lists none, null when the panel could not be read on this call (the response then carries a note saying so). A count above 0 means the handle was renamed at least once; the names themselves are not published."
                            },
                            "verified_at": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Instagram profile/about, opt-in (`include=verified_at`): the month Instagram verified the account, as the panel shows it (\"April 2024\"). A month, not a date. Null when the account is not verified or the panel shows no verification date. Absent unless requested."
                            },
                            "public_email": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.public_email"
                            },
                            "contact_email": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Opt-in (`contact_email=1` on instagram/profile, youtube/channel and youtube/channel/about). When the bio lists two or more email addresses, the one the creator gives for contacting them personally, copied verbatim. Null when there is one address or none, when every address belongs to a manager, agency or brand, or when the choice was not confident. `author.ext.public_email` (the first address in the bio) is unchanged."
                            },
                            "public_phone": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.public_phone"
                            },
                            "similar_source": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.similar_source"
                            },
                            "instagram_username": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.instagram_username"
                            },
                            "similar_via": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.similar_via"
                            },
                            "business_category": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.business_category"
                            },
                            "bio_links": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.bio_links",
                              "items": {
                                "type": "object",
                                "description": "Nested object: author.ext.bio_links",
                                "properties": {
                                  "title": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at author.ext.bio_links.title"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at author.ext.bio_links.url"
                                  },
                                  "link_type": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at author.ext.bio_links.link_type"
                                  }
                                }
                              }
                            },
                            "is_business": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_business"
                            },
                            "is_professional": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_professional"
                            },
                            "creator_marketplace": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.creator_marketplace"
                            },
                            "verification_label": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.verification_label"
                            },
                            "fbid": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.fbid"
                            },
                            "hd_avatar_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.hd_avatar_url"
                            },
                            "website": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.website"
                            },
                            "cover_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.cover_url"
                            },
                            "page_active": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.page_active"
                            },
                            "employee_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.employee_count"
                            },
                            "employee_count_range": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "description": "Nested object: author.ext.employee_count_range",
                              "properties": {
                                "start": {
                                  "type": [
                                    "integer",
                                    "null"
                                  ],
                                  "description": "Numeric at author.ext.employee_count_range.start"
                                },
                                "end": {
                                  "type": [
                                    "integer",
                                    "null"
                                  ],
                                  "description": "Numeric at author.ext.employee_count_range.end"
                                }
                              }
                            },
                            "founded_year": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.founded_year"
                            },
                            "company_type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.company_type"
                            },
                            "tagline": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.tagline"
                            },
                            "specialities": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.specialities",
                              "items": {
                                "type": "string",
                                "description": "String at author.ext.specialities"
                              }
                            },
                            "industries": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.industries",
                              "items": {
                                "type": "string",
                                "description": "String at author.ext.industries"
                              }
                            },
                            "headquarters": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at author.ext.headquarters"
                            },
                            "locations": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.locations",
                              "items": {
                                "type": "string",
                                "description": "Leaf at author.ext.locations"
                              }
                            },
                            "hashtags": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.hashtags",
                              "items": {
                                "type": "string",
                                "description": "Leaf at author.ext.hashtags"
                              }
                            },
                            "funding": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at author.ext.funding"
                            },
                            "address": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.address"
                            },
                            "price_range": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.price_range"
                            },
                            "rating": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.rating"
                            },
                            "rating_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.rating_count"
                            },
                            "talking_about_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.talking_about_count"
                            },
                            "business_hours": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.business_hours",
                              "items": {
                                "type": "string",
                                "description": "Leaf at author.ext.business_hours"
                              }
                            },
                            "links": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.links",
                              "items": {
                                "type": "string",
                                "description": "Leaf at author.ext.links"
                              }
                            },
                            "ad_library_page_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.ad_library_page_id"
                            },
                            "ad_library_status": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.ad_library_status"
                            },
                            "urn": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.urn"
                            },
                            "is_top_voice": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_top_voice"
                            },
                            "is_premium": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_premium"
                            },
                            "is_creator": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_creator"
                            },
                            "is_influencer": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_influencer"
                            },
                            "is_open_to_work": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_open_to_work"
                            },
                            "is_hiring": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_hiring"
                            },
                            "member_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.member_id"
                            },
                            "company_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.company_id"
                            },
                            "reaction_type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.reaction_type"
                            },
                            "followers_approximate": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "True when `author.followers` is a published or rounded figure rather than an unrounded census: LinkedIn people-list display buckets, TikTok `stats.followerCount` when the exact sibling is absent, and YouTube subscriber counts at or above 1,000. Null or absent on exact counts."
                            },
                            "counts_source": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "TikTok profile only. Which of TikTok's two live counter sets `author.followers`, `author.following`, `author.likes_count` and `author.posts_count` carry: `app` (TikTok's app counters, the default) or `web` (the website's `statsV2`, returned with `counts=web`). The two sets can differ by a few percent in either direction."
                            },
                            "keywords": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.keywords"
                            },
                            "total_views": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.total_views"
                            },
                            "joined_at_timestamp": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.joined_at_timestamp"
                            },
                            "topicCategories": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.topicCategories",
                              "items": {
                                "type": "string",
                                "description": "String at author.ext.topicCategories"
                              }
                            },
                            "bannerExternalUrl": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.bannerExternalUrl"
                            },
                            "madeForKids": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.madeForKids"
                            },
                            "hiddenSubscriberCount": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.hiddenSubscriberCount"
                            },
                            "related_playlists": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at author.ext.related_playlists"
                            },
                            "topic_ids": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.topic_ids",
                              "items": {
                                "type": "string",
                                "description": "String at author.ext.topic_ids"
                              }
                            },
                            "unsubscribed_trailer": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.unsubscribed_trailer"
                            },
                            "localizations": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at author.ext.localizations"
                            },
                            "monthly_listeners": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.monthly_listeners"
                            },
                            "total_ratings": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Spotify podcasts only: how many listeners have rated the show. Cumulative over the show's whole run, so it reflects longevity as well as size, and it is NOT an audience count (Spotify publishes no play, download, subscriber or follower count for a podcast)"
                            },
                            "average_rating": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Spotify podcasts only: mean listener rating from 0 to 5. Fractional (e.g. 4.66) despite the integer type this schema emits for every numeric leaf"
                            },
                            "creator_username": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.creator_username"
                            },
                            "join_policy": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.join_policy"
                            },
                            "is_nsfw": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_nsfw"
                            },
                            "rules": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.rules",
                              "items": {
                                "type": "string",
                                "description": "Leaf at author.ext.rules"
                              }
                            },
                            "weekly_active_users": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.weekly_active_users"
                            },
                            "weekly_contributions": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.weekly_contributions"
                            },
                            "rules_text": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.rules_text"
                            },
                            "language": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.language"
                            },
                            "post_karma": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.post_karma"
                            },
                            "comment_karma": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.comment_karma"
                            },
                            "awardee_karma": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.awardee_karma"
                            },
                            "trophy_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.trophy_count"
                            },
                            "banner_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.banner_url"
                            },
                            "profile_title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.profile_title"
                            },
                            "social_links": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.social_links",
                              "items": {
                                "type": "string",
                                "description": "Leaf at author.ext.social_links"
                              }
                            },
                            "bio_link": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.bio_link"
                            },
                            "embed_html": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.embed_html"
                            },
                            "embed_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.embed_url"
                            },
                            "group": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at author.ext.group"
                            },
                            "search_hit": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "description": "Nested object: author.ext.search_hit",
                              "properties": {
                                "match": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Leaf at author.ext.search_hit.match"
                                },
                                "title": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at author.ext.search_hit.title"
                                },
                                "snippet": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at author.ext.search_hit.snippet"
                                },
                                "evidence_url": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at author.ext.search_hit.evidence_url"
                                },
                                "matched_urls": {
                                  "type": [
                                    "array",
                                    "null"
                                  ],
                                  "description": "Array at author.ext.search_hit.matched_urls",
                                  "items": {
                                    "type": "string",
                                    "description": "String at author.ext.search_hit.matched_urls"
                                  }
                                }
                              }
                            },
                            "blog_name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.blog_name"
                            },
                            "blog_no": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.blog_no"
                            },
                            "visitors_today": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.visitors_today"
                            },
                            "visitors_total": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.visitors_total"
                            },
                            "topic": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.topic"
                            },
                            "power_blog": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.power_blog"
                            },
                            "official_blog": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.official_blog"
                            }
                          }
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      }
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "reddit",
                  "endpoint": "/v1/reddit/subreddit/details",
                  "data": {
                    "author": {
                      "id": "AskReddit",
                      "username": "AskReddit",
                      "display_name": "AskReddit",
                      "avatar_url": "https://styles.redditmedia.com/t5_2qh1i/styles/communityIcon_p6kb2m6b185b1.png?width=128&frame=1&auto=webp&s=1124511c3a95cc4ec094a4e8886de1e08a0f1e0a",
                      "bio": "r/AskReddit is the place to ask and answer thought-provoking questions.",
                      "verified": null,
                      "followers": 59785424,
                      "following": null,
                      "posts_count": null,
                      "likes_count": null,
                      "url": "https://www.reddit.com/r/AskReddit",
                      "private": null,
                      "joined_at": "2008-01-25T03:52:15.108Z",
                      "ext": {
                        "is_nsfw": false,
                        "weekly_active_users": 13295443,
                        "weekly_contributions": 1097994,
                        "rules_text": "1 Rule 1 - Questions must be clear and direct and may not use the body textbox All questions must be clear, written in English, and conclude with a question mark All context in the title must be necessary to understanding the question; do not give “example answers” in the post title (i.e. “Other than your mom, ______?”) No text in the text box - any additional info from you must be added as a comment to your post The full rule can be viewed here\n\n2 Rule 2 - No personal or professional advice requests Askreddit is NOT your personal or professional advice platform Do not makes posts asking for professional advice - medical, legal, financial, or otherwise All posts asking for advice must be generic and not specific to your situation alone Do not use first person pronouns No crowdsourcing naming or purchasing decisions The full rule can be viewed here\n\n3 Rule 3 - Open ended questions only Post must be an open-ended discussion question Title must not be phrased to allow a simple yes/no answer No questions that have definite answers Question must not be a poll or survey No “Either/Or” type questions Do not ask for NSFW links Do not specify a length (eg \"in three words...\") or make your post into a game The full rule can be viewed here\n\n4 Rule 4 - No personal info Do not post or seek any real or fake personal information (examples include: full names, phone numbers, email addresses, or social media accounts) Only link another user's comment when it is relevant and never when it is to launch a personal attack or encourage others to do so Do not ask questions designed to target specific usernames or links to social media The full rule can be viewed here\n\n5 Rule 5 - No loaded questions Do not include an opinion, bias, or lead respondents towards expressing a specific opinion in your post title Do not use this subreddit to promote a specific agenda or to gain positive or negative publicity for an entity or person The full rule can be viewed here\n\n6 Rule 6 - [Serious] tagged posts are off-limits to jokes or irrelevant replies [Serious] posts are off-limits for joke replies and irrelevant or off-topic comments and discussion If the OP asks for answers from a specific group in a [Serious] post, top level comments must be made from members of that group Posts that do not receive relevant answers within an hour will be removed The full rule can be viewed here\n\n7 Rule 7 - No begging for goods or services, or Reddit rewards Do not ask for Reddit rewards, money, goods, services,or favors Do not form a brigade to draw positive or negative attention to posts or comments in AskReddit, even from other subreddits The full rule can be viewed here\n\n8 Rule 8 - Be respectful to other users at all times and conduct your behaviour in a civil manner Do not make personal attacks, insult, or demean a specific group or person Do not use slurs without relevant context and quotes No blatant statements of bigotry No posts that 'bait' users into breaking other rules Zero tolerance for posts/comments that sexualize minors Zero tolerance for posts/comments that encourage suicide The full rule can be viewed here\n\n9 Rule 9 - No image only replies or large ascii art Comment replies must consist of more than just an image or link No ASCII/emoji images over one line The full rule can be viewed here\n\n10 Rule 10 - Harmful Misinformation Do not downplay the effects of a medical crisis Do not undermine the efficacy of vaccines where there is widespread agreement among the medical and scientific communities Do not encourage illegal activity Do not encourage delayed medical treatment The full rule can be viewed here\n\n11 Rule 11 - No spam, machine generated content or karma farming Do not post spam Do not edit comments to mislead and/or advertise Do not farm karma or shotgun comments Bots are not allowed in r/AskReddit The full rule can be viewed here\n\n12 Rule 12 - All content must be written in English All content must be written in English so that it is widely understood by the user base of the sub. Posts not in English will be removed. Comments not in English may be removed. The full rule can be viewed here",
                        "language": "en"
                      }
                    },
                    "computed": {
                      "engagement_rate": null,
                      "language": "en",
                      "content_category": "other",
                      "estimated_reach": null
                    }
                  },
                  "credits_used": 1,
                  "request_id": "req_example000000",
                  "cached": false,
                  "credits_remaining": 9999,
                  "source": "captured",
                  "captured_at": "2026-10-02T15:39:31.337Z",
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/reddit/search": {
      "get": {
        "summary": "Search Reddit posts",
        "description": "Searches Reddit for posts matching a keyword query. Returns a list of matching posts with titles, scores, comment counts, subreddit names, and permalinks. One result page is assembled from more than one index, so a few leaves are reported for only part of a page and are `null` on the rest: `post.flags.spoiler`, `post.engagement.shares` and `post.engagement.saves`. A `null` there means the index that returned that row does not report the field, never that the value is false or zero — treat those three as opportunistic and do not aggregate over them. The post body is at `ext.selftext` (`content.text` is the title and body joined, matching `/v1/reddit/post`); this surface sends it on self-posts without any extra flag. A page holds up to 25 posts and the exact count varies between calls, so do not assume a fixed page size: pages of about 7 are common and a sparse query can return fewer. Rows beyond the first few, and the newest rows on a `sort=new` page, may carry fewer fields than the rest: `flags.spoiler` in particular is present on some rows and null on others within one response. Where a row carries them you also get the author's avatar at `author.avatar_url`, images or video at `content.media_urls`, and the upvote ratio, post flair and Reddit's own content language at `ext.upvote_ratio`, `ext.flair` and `ext.content_language`. `include_body=true` is still accepted and rarely needed now: bodies arrive on the rows themselves, so on most pages the flag finds nothing to fetch and its extra credits are refunded in full. It still hydrates a row that does arrive without a body, at 1 extra credit per row hydrated, up to 25 per page. Link posts have no body, so `ext.selftext` is null. Ranking is a voice-of-customer sweep rather than precision retrieval: expect some off-topic matches on short or ambiguous queries, and use quoted phrases to tighten them. To get more than one page in a single call, set `limit` (26 to 1,000): the call then reads Reddit's own search index once and returns up to that many posts for the query, sort and timeframe, newest first with `sort=new`, at 1 credit per 25 posts returned. Reddit stops one query at about 1,000 posts, so that answer has no next page; to collect more than that on a busy keyword, repeat the call through the day with `sort=new` and `since` set to your last run (or `seen`), and you pay only for the new posts. Those rows carry the same fields as the rest of the page, with `post.flags.spoiler`, `post.engagement.shares` and `post.engagement.saves` null, and the default relevance score and labels cover the first 100 of them.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_search",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 1,
        "x-credit-cost-min": 1,
        "x-credit-cost-max": 48,
        "x-credit-cost-formula": "1 credit for the search page. include_body=true reserves up to 25 extra credits and refunds every one it does not spend. Rows now arrive with their bodies, and a link post has no body to fetch, so a row is only charged for when a body actually comes back: on most pages nothing is spent and the page costs 1 credit. With limit above 25: 1 credit per 25 posts returned, never less than 1. The call holds limit / 25 credits (rounded up, at most 40) and refunds the rest once the posts are counted; posts left out by since or until are not counted. Relevance against your query (by default, or with relevance=) is free. Adding relevant_to= holds 4 extra credits and refunds down to 1 credit per started 25 rows that were newly judged: rows already judged for the same topic are free, a page where nothing could be judged refunds the whole extra, and a cached page is free. The default labels (sponsored, intent, niche) are free. label=mention, quality, ai_style, ai_written, injection, or label=intent with offer=, holds 4 extra credits and refunds down to 1 credit per started 25 posts that were newly judged: posts already labelled are free, a page where nothing could be judged refunds the whole extra, and a cached page is free. With `max_pages`, `max_items` or `max_credits`, each page walked is billed at this price (a cached page is free), and `max_credits` caps the total. With `seen`, a page's price falls with its share of rows you already received under that id; credits for joined data (`include=`) are never discounted.",
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search words or a phrase. Words match any, not all: vision pro also returns posts that mention only one of them. Wrap a phrase in double quotes to match it exactly (query=\"vision pro\"). Reddit operators such as subreddit:name work too. When fewer than half the rows contain every word of an unquoted query, the response says so in _warnings.",
            "schema": {
              "type": "string"
            },
            "example": "\"claude code\""
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Sort by",
            "schema": {
              "type": "string",
              "enum": [
                "relevance",
                "new",
                "top",
                "comment_count"
              ]
            }
          },
          {
            "name": "timeframe",
            "in": "query",
            "required": false,
            "description": "Only return posts from this window. Applied on sort=relevance, sort=top and sort=comment_count. It has no effect with sort=new, which is already ordered newest-first and returns recent posts regardless.",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "day",
                "week",
                "month",
                "year"
              ]
            }
          },
          {
            "name": "after",
            "in": "query",
            "required": false,
            "description": "Used to paginate to next page Native upstream cursor param. Send the universal `cursor` instead: the API maps it to this name for you.",
            "deprecated": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Set to true for a trimmed down version of the response. On this endpoint it also skips the second source that widens the page, so a trimmed page is both thinner and usually shorter. Measured 09/09/2026: default 29 rows, `trim=true` 25 rows. It does not drop `author.avatar_url` or `ext.*` — those leaves stay when the first source already carried them. Use it to skip the widening pass, not to strip fields.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "include_body",
            "in": "query",
            "required": false,
            "description": "Set to true to include each post's body (selftext) on the search page. Rarely needed now: bodies arrive on the rows themselves. 1 extra credit per row that actually comes back with a body, unused credits refunded. Link posts have no body, so they are looked up and not charged for.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "How many posts to return in one call, 26 to 1,000. Above 25 the call reads Reddit's own search index once instead of returning one page: up to this many posts for the query, sort and timeframe, newest first with sort=new, at 1 credit per 25 posts returned (limit / 25 is held up front and the rest refunded). Reddit stops one query at about 1,000 posts, so this answer has no next page. At 25 or below the ordinary page is returned exactly as without it, and a request that carries after is a next page, so limit does not apply to it.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000
            }
          },
          {
            "name": "relevance",
            "in": "query",
            "required": false,
            "description": "Optional. Without this param every row already carries computed.relevance against your query, free ({ p, sense, depth, spam }: is this row about what your query means, or a different thing that shares its words?), and nothing is dropped or reordered. score asks for it explicitly and waits for every row; filter also drops the rows that are not about your query, and lists their ids in data.relevance.dropped_ids. Your query is the topic; nothing to configure. A row that could not be judged is never dropped and carries relevance: null. Pagination is unchanged, so a filtered page can hold fewer rows. Free with your query as the topic; with relevant_to it adds 1 credit per started 25 newly judged rows (rows already judged for the same topic are free, and so is a cached page).",
            "schema": {
              "type": "string",
              "enum": [
                "score",
                "filter"
              ]
            }
          },
          {
            "name": "relevance_threshold",
            "in": "query",
            "required": false,
            "description": "Optional, only with relevance. The probability (0 to 1) a row must reach to be kept by relevance=filter. Default 0.5. Lower keeps more rows, higher keeps fewer.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "relevant_to",
            "in": "query",
            "required": false,
            "description": "Optional, only with relevance. Up to 200 characters describing what you mean, used as the topic instead of the query. Use it when the query is ambiguous, for example query=cleopatra with relevant_to=Cleopatra, the IGT slot game.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "judgments",
            "in": "query",
            "required": false,
            "description": "Optional, on (the default) or off. By default every row gains free SocialCrawl judgments (computed.labels, and computed.relevance on search endpoints), reported in data.labels (mode default) and data.relevance (origin default), each with a status (complete, partial or skipped) and pending: the rows still being judged when the page was sent, which carry null now and are filled on your next call or cached read. Default judgments never add credits, never change an existing field, and never drop or reorder a row. off returns the page exactly as before, with none of those keys. label=none does the same.",
            "schema": {
              "type": "string",
              "enum": [
                "on",
                "off"
              ]
            }
          },
          {
            "name": "dry_run",
            "in": "query",
            "required": false,
            "description": "Optional. When 1, return a cost preview for this labelled or relevance-filtered request without fetching the page or judging any row. data.estimate reports rows_expected, rows_cached, label_credits_min, label_credits_max and base_credits. 0 credits charged.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            }
          },
          {
            "name": "fit",
            "in": "query",
            "required": false,
            "description": "Optional. When goal, keep the rows and fields needed for the goal you pass in goal= (plus any that are uncertain, and the first and last), and replace the rest with a stub. data.held_back lists the held ids and a recall id that re-reads the full page from cache at no extra charge. Without this param the page is unchanged.",
            "schema": {
              "type": "string",
              "enum": [
                "goal"
              ]
            }
          },
          {
            "name": "goal",
            "in": "query",
            "required": false,
            "description": "Required by fit=goal. What you are trying to do, in your own words, up to 300 characters.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "fit_tokens",
            "in": "query",
            "required": false,
            "description": "Optional, only with fit=goal. Soft cap on how much of the page to keep, in tokens. Uncertain blocks and the first and last block are kept even if they exceed it.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "label",
            "in": "query",
            "required": false,
            "description": "Optional CSV of SocialCrawl labels to add to every post. Without this param every page already carries sponsored, intent and niche, free; label= adds the labels you name to them (the defaults keep running). sponsored, intent and niche are free when asked for too; mention, quality, ai_style, intent with offer=, and injection add 1 credit per started 25 newly judged posts. judgments=off (or label=none) turns the default labels off. sponsored: is the post a paid or gifted promotion (p, 0 to 1), did it carry a disclosure marker such as #ad or 광고 (disclosed), is it likely paid with no marker (undisclosed), and which of the accounts it mentions does it promote (brand, or null). These are signals to review, never a finding. mention (needs brand=): is the post about that brand rather than something that shares its name (about_brand, 0 to 1), how it feels about the brand on five levels (sentiment_level 0 to 4 and sentiment_score 0 to 1, null when the post is not about the brand), is it sarcastic, which aspect it talks about (taste_or_quality, price_or_value, availability_or_delivery, health_or_safety, advertising_or_campaign, customer_service, none), and did the author buy or use it (first_hand). intent: what the author is mainly doing (label: asking_for_recommendation, comparing_options, switching_away, complaining, promoting, news_or_discussion, other, or null when unsure, with confidence), whether they read as a potential buyer rather than a seller (buyer, seller), how pressing the need is (urgency, 0 to 3), and, when you pass offer=, whether your offer would plausibly help them (fits_offer). niche: which of the 33 niches of the published taxonomy sc-niche-v1 the caption belongs to, or personal_no_niche, or other (label, confidence, taxonomy), with label null when the caption is too thin to tell or the pick is unsure. It reads the caption only, not the video. quality: how much checkable detail the caption carries (fact_density 0 to 3), whether it mainly asks for likes, replies, shares, follows or tags (engagement_bait, 0 to 1), whether it is written to provoke anger as a way to get engagement (rage_bait, 0 to 1; about the writing, never the side taken), whether it only repeats someone else's news or view (secondhand, 0 to 1), and what the post is mainly doing (post_aim: inform, opinion, sell, entertain, provoke, other). exclude=engagement_bait drops posts whose engagement_bait is 0.8 or higher. ai_style: writing patterns common in AI-generated text, judged on the text alone. It does not say who wrote the post, and a person who writes in this style is flagged too. Six patterns are judged, each a probability (0 to 1): binary_contrast (\"This is not X. It's Y.\"), faux_insight (\"Here's what nobody tells you\" and throat-clearing openers), colon_reveal (\"The best part: it learns.\"), profound_kicker (ends on an aphorism or mic-drop line), puffery (\"marks a pivotal moment\", \"highlighting the importance of\") and rhetorical_setup (\"What if I told you\", a question the post answers itself, \"Not a X. Not a Y. A Z.\"). Four are counted in the text: slop_words (words and phrases such as delve, leverage, robust, game changer, at the end of the day), em_dashes, emoji_bullets (lines that start with an emoji or a symbol bullet) and one_line_paragraphs (paragraphs that are one short line). pattern_count is how many patterns are present (a judged pattern at 0.8 or higher, slop_words 1 or more, em_dashes 2 or more, emoji_bullets 2 or more, one_line_paragraphs 5 or more) and markers lists their names, comma-separated. A post with less than about eight words of text is only counted, with every judged pattern 0. The judged patterns read the first 400 and the last 150 characters of a long post, and the counts read the whole post. exclude=ai_style drops posts with 2 or more patterns. ai_written: how likely the post was written by an AI model, from SocialCrawl's own text classifier, reading the opening of the post (about 1,000 characters): p (0 to 1, calibrated), level (likely (p 0.95 or higher), possible (p 0.71 or higher) or unlikely) and model (the model name; a new name means a new scale). A post under 8 words is too short to read: p null, level too_short. It is a probability, not proof: a person can be flagged and an AI-written post can pass, and the shorter the post the less certain it is. exclude=ai_written drops likely posts. injection flags text that addresses an AI system and tries to direct it (flagged, p); it never drops or rewrites a row. A post that could not be judged carries labels: null. Posts already labelled for anyone are free, and so is a cached page. data.labels reports what was judged and billed.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "exclude",
            "in": "query",
            "required": false,
            "description": "Optional CSV (engagement_bait, ai_style, ai_written). engagement_bait, only with label=quality, drops posts whose engagement_bait probability is 0.8 or higher. ai_style, only with label=ai_style, drops posts that show 2 or more of its writing patterns (pattern_count 2 or higher). ai_written, only with label=ai_written, drops posts whose level is likely (p 0.95 or higher), or whose p reaches your ai_written_threshold; a post too short to read is never dropped. Dropped posts are listed in data.labels.dropped_ids. A post that could not be judged is never dropped.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ai_written_threshold",
            "in": "query",
            "required": false,
            "description": "Optional, only with label=ai_written and exclude=ai_written. The p (0 to 1) at which exclude=ai_written drops a post. Default 0.95 (level likely). 0.71 also drops possible posts: more AI posts go, and more posts by people with them.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "brand",
            "in": "query",
            "required": false,
            "description": "Required by label=mention, ignored otherwise. The brand or product the posts are judged against, up to 300 characters, for example brand=Buldak. Without it label=mention is skipped with the warning label_mention_needs_brand and is not billed.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "brand_description",
            "in": "query",
            "required": false,
            "description": "Optional, with label=mention. One plain sentence saying what the brand is, for example brand_description=Samyang's spicy instant noodle brand. Use it when the name is also an ordinary word or another company's name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offer",
            "in": "query",
            "required": false,
            "description": "Optional, with label=intent. One or two plain sentences saying what you sell, up to 300 characters, for example offer=A web design agency that builds websites for small businesses. Adds fits_offer to every post; without it fits_offer is null.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "label_evidence",
            "in": "query",
            "required": false,
            "description": "Optional, only with label=. When 1, every labelled row also carries computed.labels_evidence.<preset> = { quote, sentence_index }: the sentence in the row that most clearly shows the label, copied verbatim. Absent or null when no single sentence shows it.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            }
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Only rows published on or after this date: YYYY-MM-DD (midnight UTC) or an ISO 8601 timestamp. Rows older than it are left off the page, and the page that reaches one ends the walk: `next_cursor` is not returned and `pagination.stopped_at` is `since`. Sending it sets the newest-first sort shown in this endpoint's sort parameter (any other sort value is a free 400). The page still costs what a page costs, so you pay for the pages you walk and no more. A row with no date is kept. `published_after`, `start_date`, `from_date`, `publish_time` (`yesterday`, `this-week`, `this-month`, `last-3-months`, `last-6-months`) and `max_age_days` are accepted and applied as `since`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "until",
            "in": "query",
            "required": false,
            "description": "Only rows published on or before this date: YYYY-MM-DD (that whole UTC day is included) or an ISO 8601 timestamp. Newer rows are left off each page and the walk does not stop, so older pages follow. A row with no date is kept. `published_before`, `end_date` and `to_date` are accepted and applied as `until`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_age_days",
            "in": "query",
            "required": false,
            "description": "Keep only rows published within this many days (`post.published_at`), 1 to 3650. A row with no date is discarded. Filtering runs on our side after each page is fetched, so every page walked is billed as usual; `data.walk.discarded` counts what was removed and why. Each page is its own entry in `GET /v1/credits/transactions`, under the page's request id listed in `data.walk.request_ids`.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 3650
            }
          },
          {
            "name": "max_pages",
            "in": "query",
            "required": false,
            "description": "1 to 50 (default 1, or 50 when `max_items` or `max_credits` is sent). Walk up to this many pages in one call and return the rows from all of them (after any filter). Each page walked is billed exactly as one call to this endpoint (a cached page is free) and counts against your rate limit; its charge and any refund are recorded under the page's own request id, listed in `data.walk.request_ids`. The walk stops early at the last page, or when the request's time budget runs low; `data.walk.stopped` says why (`end`, `max_pages`, `max_items`, `max_credits`, `time_budget`, `page_error`) and `pagination.next_cursor` continues from where it stopped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "max_items",
            "in": "query",
            "required": false,
            "description": "1 to 5000. Get more in one call: keep walking pages until the response holds at least this many rows (after any filter), then stop with `data.walk.stopped: \"max_items\"`. The last page is returned whole (it was billed), so `data.items` can hold up to one page more than this, and `pagination.next_cursor` resumes right after it without skipping a row. Walks up to 50 pages unless `max_pages` says fewer; each page is billed as one call (a cached page is free). Add `max_credits` to cap the spend. A long walk can stop on the time budget first (`\"time_budget\"`): send the returned cursor with the same params to continue.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "max_credits",
            "in": "query",
            "required": false,
            "description": "1 to 100000. The most this call may spend, across every page it walks. A page starts only while the credits already spent plus that page's price (or, when higher, the most any page of this walk has cost) still fit, so the call never goes past it; the walk then stops with `data.walk.stopped: \"max_credits\"` and the cursor to resume. Sent alone, it walks as far as the budget goes (up to 50 pages). A value below the price of one page is a free 400 whose `error.details.page_credits` names that price. Credits a row join (`include=`) adds are known only once a page has run, so page 1 is checked against its own price.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            }
          },
          {
            "name": "seen",
            "in": "query",
            "required": false,
            "description": "An id you choose (1 to 64 letters, digits, `.`, `_` or `-`). Rows your account already received under the same `seen` id are removed from the page, and the page price falls with the share of repeats: page credits x new rows / rows on the page, rounded up, so a page of nothing but repeats is free. Only the page's own price is discounted: credits for joined data (`include=`) are charged only for rows you have not received, and are never discounted. The memory lasts 24 hours from the last call that used the id, holds row ids only, and is private to your account. Use one id across a set of related searches; `data.walk.repeats` counts what was removed.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Universal pagination cursor. Send `pagination.next_cursor` from the previous response back verbatim: the API maps it to this endpoint's native `after` (cursor style). You never construct, decode, or look up a cursor. Omit it for page 1.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/search"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of canonical post wrappers ({ post, computed })",
                          "items": {
                            "type": "object",
                            "description": "Canonical post wrapper",
                            "properties": {
                              "post": {
                                "type": "object",
                                "description": "Canonical Post object (unified across all platforms)",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "Platform-specific post ID (always a string; numeric upstream IDs are stringified)"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Direct URL to the post on the source platform"
                                  },
                                  "content": {
                                    "type": "object",
                                    "description": "Post content fields (text, media, thumbnail, duration)",
                                    "properties": {
                                      "text": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Post caption, description, or text content"
                                      },
                                      "media_urls": {
                                        "type": [
                                          "string",
                                          "array",
                                          "null"
                                        ],
                                        "description": "URL(s) of the primary media. Single string for video/photo posts; array of strings for carousels.",
                                        "items": {
                                          "type": "string",
                                          "description": "URL(s) of the primary media. Single string for video/photo posts; array of strings for carousels."
                                        }
                                      },
                                      "thumbnail_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "URL to thumbnail image"
                                      },
                                      "duration_seconds": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Video/clip duration in seconds (null for non-video posts)"
                                      }
                                    }
                                  },
                                  "author": {
                                    "type": "object",
                                    "description": "Subset of Author fields for the post creator",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Author username"
                                      },
                                      "display_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Author display name"
                                      },
                                      "avatar_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "URL to author profile picture"
                                      },
                                      "verified": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Whether the author account is verified"
                                      }
                                    }
                                  },
                                  "engagement": {
                                    "type": "object",
                                    "description": "Engagement counts",
                                    "properties": {
                                      "views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "View count (if available). For Instagram video/reels this is the play count: the headline 'Views' the IG app shows. Instagram removed per-post play counts from its public web pages in August 2026, so `GET /v1/instagram/post` now fills the count automatically from a second source within the same call: videos and reels keep a numeric `views` with no extra endpoint or workaround. Note: since mid-July 2026 Instagram's play count is Instagram-only. It no longer includes Facebook crosspost views (Meta-side change; the app UI changed identically). For combined reach, also fetch the Facebook crosspost via `/v1/facebook/post`."
                                      },
                                      "likes": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Like / reaction count"
                                      },
                                      "comments": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Comment count. Note: on `GET /v1/instagram/post` this is Instagram's `edge_media_to_parent_comment.count` (top-level comments); the IG list endpoints report the mobile `comment_count` total (includes replies). Both land on this same field."
                                      },
                                      "shares": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Share / repost / retweet count. On Instagram this is `reshare_count` (the paper-plane Share / Send count) and it exists only on Instagram's mobile surface, so it is returned by `/v1/instagram/post/stats`, `/v1/instagram/profile/reels/full`, and `/v1/instagram/profile/posts/full`. The web-sourced Instagram list and search endpoints return `null` (never fabricated)."
                                      },
                                      "saves": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Save / bookmark count. `null` on Instagram: the save count is platform-private and Instagram exposes no numeric save metric on any surface (never fabricated)."
                                      }
                                    }
                                  },
                                  "flags": {
                                    "type": "object",
                                    "description": "Boolean flags on the post",
                                    "properties": {
                                      "nsfw": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "NSFW flag (null when platform does not surface)"
                                      },
                                      "spoiler": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Spoiler flag (null when platform does not surface)"
                                      },
                                      "pinned": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Pinned-to-profile flag (null when platform does not surface)"
                                      },
                                      "deleted": {
                                        "type": "boolean",
                                        "description": "Whether the post is tombstoned (always present)"
                                      },
                                      "likes_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Present and `true` when the creator has hidden the like count. `engagement.likes` is `null` in that case (never the platform's decoy preview number). Absent on normal posts."
                                      },
                                      "comments_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Present and `true` when the upstream reports the comment count as hidden. `engagement.comments` is `null` in that case. Absent on normal posts."
                                      },
                                      "shares_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.shares_hidden"
                                      },
                                      "views_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.views_hidden"
                                      },
                                      "saves_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.saves_hidden"
                                      }
                                    }
                                  },
                                  "published_at": {
                                    "type": [
                                      "string",
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Post creation timestamp as an ISO 8601 UTC string. When the upstream sent a Unix epoch it is converted here and the raw epoch is preserved under `post.ext.published_at_epoch` for one deprecation cycle."
                                  },
                                  "ext": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Platform-specific passthrough fields for cross-endpoint chains (present only on platforms that surface them)",
                                    "properties": {
                                      "music_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok music/clip id (exact string): pass to `/v1/tiktok/song/videos?clipId=` to find videos using the same sound"
                                      },
                                      "matched_song_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The catalogue song TikTok matched the video's sound to, as an exact digit string. An official clip and the original sounds creators upload with it have different `music_id` values and the same `matched_song_id`, so group rows on it to count every use of one song. It is not a clipId: `/v1/tiktok/song` and `/v1/tiktok/song/videos` do not accept it. `/v1/tiktok/search/music` carries it on each sound, so a search on the song's title and artist, kept to the sounds with the same `matched_song_id`, gives the song's official sounds and their `video_count`. Absent when TikTok matched the sound to no song, and on rows served from a source that does not report the match."
                                      },
                                      "matched_song_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The title of the song in `matched_song_id`. Absent when there is no matched song."
                                      },
                                      "matched_song_artist": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The artist of the song in `matched_song_id`, as TikTok's catalogue names it. Absent when there is no matched song."
                                      },
                                      "music_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The title of the video's own sound (`music_id`). An uploaded sound is titled like `original sound - <handle>`; the song it plays, when TikTok recognised one, is `matched_song_title`."
                                      },
                                      "music_artist": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The artist TikTok shows for the video's own sound. On an original sound this is the uploader's display name, not the song's artist; use `matched_song_artist` for that."
                                      },
                                      "music_is_original": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "TikTok only. `true` when the video's sound is an original sound a creator uploaded, `false` when it is a catalogue track. Absent when the source does not say."
                                      },
                                      "author_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The creator's platform-native numeric user id. On TikTok search and list items, pass to `/v1/tiktok/profile?user_id=` for the creator's current follower count (survives username changes). On Instagram `/v1/instagram/search/reels`, `/v1/instagram/search/hashtag` and `/v1/instagram/location/posts` items it is present on every row, accepted by `/v1/instagram/profile/country?user_id=` and `/v1/instagram/basic-profile?userId=`. On Facebook it appears when the upstream exposed a numeric actor id and no real handle."
                                      },
                                      "author_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The posting account's profile URL, so a matching post can be followed to its account. Present on `/v1/facebook/search/posts` rows: the vanity or `/people/<name>/<id>/` URL when Facebook sends one, otherwise `https://www.facebook.com/profile.php?id=<numeric id>` built from the account id. Pass it as `url` to `/v1/facebook/profile` (or to `/v1/prism/profiles` with `platform: facebook`). Null when the row names neither an account URL nor a numeric account id. Absent on other endpoints."
                                      },
                                      "author_followers": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The creator's follower count as embedded in the search payload itself, when the search source happens to carry one. On Instagram `search/reels` it is null on a plain call, because Instagram stopped sending follower counts in its search payload in August 2026; send `include=creator` (or `country`) and it is filled from the creator's profile, 2 credits per creator looked up. It stays null when that lookup does not resolve."
                                      },
                                      "author_following": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.author_following"
                                      },
                                      "author_posts_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.author_posts_count"
                                      },
                                      "author_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The free text the author wrote in their profile's location field, exactly as written (for example `Johannesburg, South Africa`). It is not a country code and is not checked. Present on X tweet and reply rows; null or absent when the author left it blank."
                                      },
                                      "in_reply_to_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.in_reply_to_id"
                                      },
                                      "in_reply_to_username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.in_reply_to_username"
                                      },
                                      "conversation_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.conversation_id"
                                      },
                                      "author_country": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The creator's country. On Instagram it is the country the creator declares on the About this account panel, as a country name (for example `Spain`), and it is not where the post was filmed. It is present on `/v1/instagram/search/reels` when the request sends `include=creator`, `include=country` or `country`, and on `/v1/instagram/search/hashtag` and `/v1/instagram/location/posts` when it sends `include=country`, filled by looking the creator up. On YouTube rows joined with `include=channel` it is the channel's own country as an ISO 3166-1 alpha-2 code (for example `ZA`). Null when the platform publishes no country for the creator or the lookup did not resolve, and nothing is guessed; absent on a plain call."
                                      },
                                      "author_public_email": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The public contact email on the creator's profile. Present only on `/v1/instagram/search/reels` when the request sends `include=creator`, filled by looking the creator up. Null when the creator lists no public email or the lookup did not resolve; absent on a plain call."
                                      },
                                      "author_public_phone": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The public contact phone number on the creator's profile. Present only on `/v1/instagram/search/reels` when the request sends `include=creator`, filled by looking the creator up. Null when the creator lists no public phone or the lookup did not resolve; absent on a plain call."
                                      },
                                      "download_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "How many times the video has been saved to a device. TikTok only, and distinct from `engagement.saves`: a save keeps the video in a private collection on the platform, a download takes a copy off it, and TikTok counts the two separately. Present on TikTok post, search and post-list responses; absent everywhere else."
                                      },
                                      "region": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only: the country TikTok registers the video to, as an ISO 3166-1 alpha-2 code (normally the creator's account country when they posted). It is not the viewer's country, not the `region` you requested, and not a language. On `/v1/tiktok/trending`, `/v1/tiktok/search`, `/v1/tiktok/search/top`, `/v1/tiktok/profile/videos`, `/v1/tiktok/search/hashtag` and `/v1/tiktok/song/videos` it is how you tell which rows are from a given country: filter on it when you need only that country. A row whose source omits the country stays null. The `region` request parameter still only sets the proxy."
                                      },
                                      "subreddit": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Reddit subreddit name (search/list items): pass to `/v1/reddit/subreddit/details?subreddit=`"
                                      },
                                      "title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.title"
                                      },
                                      "selftext": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.selftext"
                                      },
                                      "upvote_ratio": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Reddit only: the share of a post's votes that are upvotes, as a fraction from 0 to 1 and usually close to 1 (six live rows measured 1, 1, 1, 0.86, 0.75, 1). Fractional despite the integer type this schema emits for every numeric leaf, the same caveat as `author.ext.average_rating`. Populated on `/v1/reddit/search` rows whose source carries it, and null everywhere else on Reddit including `/v1/reddit/post` and `/v1/reddit/subreddit`."
                                      },
                                      "flair": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.flair"
                                      },
                                      "content_language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The language the platform itself tags the post with, when it sends one: Reddit's own language tag on Reddit lanes, and TikTok's caption-language tag (for example `de`) on `/v1/tiktok/trending?feed=local`. Null when the platform could not tell (Reddit `und`, TikTok `un`, common on short or emoji-only captions); absent where the source sends no tag. Never inferred from the text by us: that is `post.computed.language`."
                                      },
                                      "type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.type"
                                      },
                                      "content_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.content_type"
                                      },
                                      "ticker_symbols": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.ticker_symbols",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.ticker_symbols"
                                        }
                                      },
                                      "video_view_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram's legacy 3-second-view count. Historical: Instagram stopped serving it in August 2026 (removed from its web post surface along with the web play count), so fresh `/v1/instagram/post` lookups no longer carry it and no source can restore it. Use `engagement.views` (the play count) instead."
                                      },
                                      "ig_play_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram-only play count (`ig_play_count`). Since mid-July 2026 Instagram's headline play count (`engagement.views`) no longer includes Facebook crosspost views and equals this value; it is surfaced explicitly so you can tell the Instagram-only figure apart and detect any future re-divergence. For combined Instagram + Facebook reach, also fetch the Facebook crosspost via `/v1/facebook/post`. Present on `/v1/instagram/post/stats` and, since the August 2026 views fix, on `/v1/instagram/post` for video posts."
                                      },
                                      "repost_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.repost_count"
                                      },
                                      "media_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.media_type"
                                      },
                                      "text_truncated": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.text_truncated"
                                      },
                                      "ip_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.ip_location"
                                      },
                                      "carousel_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.carousel_count"
                                      },
                                      "remix_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.remix_count"
                                      },
                                      "audio_cluster_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Instagram's audio cluster for a reel, as an exact digit string: the id Instagram uses to group different uploads of the same sound. Present on `/v1/instagram/audio/reels` rows and on `/v1/instagram/profile/reels` with `include=stats`; absent on a row when it is not available and on every other surface."
                                      },
                                      "facebook_likes": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post share that was EXCLUDED from `engagement.likes` on this row. A post shared to Facebook arrives from some sources with its Facebook likes already folded into the Instagram count, so the share is subtracted and published here, which keeps `engagement.likes` the Instagram-only figure instagram.com shows on the post. Add the two together for the combined number. Absent when the read carried no Facebook share, and absent on a post whose owner hides the like count, because nothing can be subtracted from a null. A response that excluded a share also carries a note in `data._warnings`."
                                      },
                                      "facebook_comments": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post share that was EXCLUDED from `engagement.comments` on this row, the comment counterpart of `post.ext.facebook_likes`. Each leaf appears only for the count it actually changed, so a post whose likes are hidden but whose comments were reconciled carries this one alone."
                                      },
                                      "instagram_views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Instagram-only play count of a video, the same figure on every Instagram endpoint. `engagement.views` keeps each endpoint's established meaning: on `/v1/instagram/profile/reels`, `/v1/instagram/audio/reels`, `/v1/instagram/search/reels` and `/v1/instagram/search/hashtag` it can include the post's Facebook cross-post views, while on `/v1/instagram/post` and `/v1/instagram/post/stats` it is Instagram-only. Read this leaf when you compare one post across endpoints. Absent on photos and when the source did not report the Instagram-only figure."
                                      },
                                      "facebook_views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post part of a video's play count, the counterpart of `post.ext.instagram_views`. Present only when the source reported the Facebook part, or a combined total above the Instagram figure. Absent does not mean zero: some sources report the Instagram figure alone even for a cross-posted video."
                                      },
                                      "published_at_epoch": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Raw Unix epoch for `published_at` (seconds, or milliseconds when the upstream sent millis). Present only when the upstream sent a numeric epoch that was normalised to the ISO 8601 `published_at` string. Kept for one deprecation cycle for integrations pinned to the numeric form."
                                      },
                                      "usertags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.usertags",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.usertags"
                                        }
                                      },
                                      "coauthors": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram collaborative posts (the native \"Collab\" feature). The full list of co-author accounts on the post, as `{ id, username, full_name, is_verified, profile_pic_url }`. A collab post has ONE producer and appears in every co-author's grid, so `post.author` is whichever account created it, which is not necessarily the profile you queried. The complete set of accounts on a post is `post.author.username` plus every `username` in this array. An empty array means Instagram reports the post as NOT a collab; the field is absent on surfaces that carry no co-author signal, including `/v1/instagram/post` (its web source ships the field permanently empty, so use `/v1/instagram/post/stats` for a single post).",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram collaborative posts (the native \"Collab\" feature). The full list of co-author accounts on the post, as `{ id, username, full_name, is_verified, profile_pic_url }`. A collab post has ONE producer and appears in every co-author's grid, so `post.author` is whichever account created it, which is not necessarily the profile you queried. The complete set of accounts on a post is `post.author.username` plus every `username` in this array. An empty array means Instagram reports the post as NOT a collab; the field is absent on surfaces that carry no co-author signal, including `/v1/instagram/post` (its web source ships the field permanently empty, so use `/v1/instagram/post/stats` for a single post)."
                                        }
                                      },
                                      "music": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.music"
                                      },
                                      "sponsor_tags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram only: the brand accounts the post tags as its paid partner, as usernames (`[\"rolex\"]`). `[]` on a post with no partner tagged. Present on `/v1/instagram/post/stats`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram only: the brand accounts the post tags as its paid partner, as usernames (`[\"rolex\"]`). `[]` on a post with no partner tagged. Present on `/v1/instagram/post/stats`; absent on every other endpoint."
                                        }
                                      },
                                      "sponsored_disclosed": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "The platform's own disclosure that the post is paid or promotional: on Instagram the paid-partnership label (`is_paid_partnership`) or a tagged brand partner, on TikTok the label TikTok shows viewers (\"Paid partnership\", \"Commission paid\", \"Promotional content\"). `false` when the post carries the flag unset, null when it carries none. Present on `/v1/instagram/post/stats`, `/v1/instagram/search/reels` and `/v1/tiktok/search`; absent on every other endpoint."
                                      },
                                      "ai_label": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Instagram only: Instagram's AI-content label on the post, as the method Instagram reports: `classifier_score_high` (Instagram detected it, shown as \"Likely made with AI\"), `ai_created` or `ai_edited` (declared or detected as made or edited with AI). Null when the post carries no AI label. Present on `/v1/instagram/post/stats`; absent on every other endpoint."
                                      },
                                      "story_mentions": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: the accounts the story mentions with a mention sticker, as usernames in alphabetical order. `[]` when it mentions nobody. Present on `/v1/instagram/stories`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: the accounts the story mentions with a mention sticker, as usernames in alphabetical order. `[]` when it mentions nobody. Present on `/v1/instagram/stories`; absent on every other endpoint."
                                        }
                                      },
                                      "story_links": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: where the story's link stickers lead, as URLs in alphabetical order. Instagram wraps each link in its own redirect with a per-view click id; both are removed, so this is the destination itself. `[]` when the story has no link sticker. Present on `/v1/instagram/stories` and `/v1/instagram/highlight/detail`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: where the story's link stickers lead, as URLs in alphabetical order. Instagram wraps each link in its own redirect with a per-view click id; both are removed, so this is the destination itself. `[]` when the story has no link sticker. Present on `/v1/instagram/stories` and `/v1/instagram/highlight/detail`; absent on every other endpoint."
                                        }
                                      },
                                      "story_reshared_posts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: the feed posts the story reshares, as post URLs (`https://www.instagram.com/p/{shortcode}/`, which `/v1/instagram/post` takes). `[]` when it reshares none. Present on `/v1/instagram/stories`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: the feed posts the story reshares, as post URLs (`https://www.instagram.com/p/{shortcode}/`, which `/v1/instagram/post` takes). `[]` when it reshares none. Present on `/v1/instagram/stories`; absent on every other endpoint."
                                        }
                                      },
                                      "location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.location"
                                      },
                                      "media": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.media",
                                        "items": {
                                          "type": "object",
                                          "description": "Nested object: post.ext.media",
                                          "properties": {
                                            "type": {
                                              "type": "string",
                                              "description": "Leaf at post.ext.media.type"
                                            },
                                            "url": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.media.url"
                                            },
                                            "width": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.media.width"
                                            },
                                            "height": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.media.height"
                                            }
                                          }
                                        }
                                      },
                                      "top_comments": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.top_comments",
                                        "items": {
                                          "type": "object",
                                          "description": "Nested object: post.ext.top_comments",
                                          "properties": {
                                            "id": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.id"
                                            },
                                            "text": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.text"
                                            },
                                            "username": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.username"
                                            },
                                            "likes": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.top_comments.likes"
                                            },
                                            "published_at": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.published_at"
                                            }
                                          }
                                        }
                                      },
                                      "hashtags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.hashtags",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.hashtags"
                                        }
                                      },
                                      "mentions": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.mentions",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.mentions"
                                        }
                                      },
                                      "mentioned_user_ids": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.mentioned_user_ids",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.mentioned_user_ids"
                                        }
                                      },
                                      "quoted_post": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Threads quote posts: the post this one quotes, as `{ id, url, author: { id, username }, text, media_urls, thumbnail_url }`. A quote post usually carries no caption or media of its own, and the text and video you see on the post's page belong to this attachment, by a different author. It is returned here rather than merged into `post.content`, so `content.*` always stays the outer post's own content and one account's media is never attributed to another. Absent on posts that are not quote posts."
                                      },
                                      "retweeted_post": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.retweeted_post"
                                      },
                                      "quote_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.quote_count"
                                      },
                                      "all_media_urls": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.all_media_urls",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.all_media_urls"
                                        }
                                      },
                                      "reaction_counts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.reaction_counts",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.reaction_counts"
                                        }
                                      },
                                      "share_urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.share_urn"
                                      },
                                      "post_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.post_type"
                                      },
                                      "activity_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.activity_id"
                                      },
                                      "published_at_precision": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.published_at_precision"
                                      },
                                      "author_urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_urn"
                                      },
                                      "author_headline": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_headline"
                                      },
                                      "author_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_type"
                                      },
                                      "is_repost_quote": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.is_repost_quote"
                                      },
                                      "article": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.article"
                                      },
                                      "reaction_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.reaction_type"
                                      },
                                      "download_media_urls": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.download_media_urls",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.download_media_urls"
                                        }
                                      },
                                      "tags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.tags",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.tags"
                                        }
                                      },
                                      "categoryId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.categoryId"
                                      },
                                      "categoryTitle": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.categoryTitle"
                                      },
                                      "topicCategories": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.topicCategories",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.topicCategories"
                                        }
                                      },
                                      "duration": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.duration"
                                      },
                                      "license": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.license"
                                      },
                                      "madeForKids": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.madeForKids"
                                      },
                                      "defaultAudioLanguage": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.defaultAudioLanguage"
                                      },
                                      "hasPaidProductPlacement": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.hasPaidProductPlacement"
                                      },
                                      "caption": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.caption"
                                      },
                                      "position": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.position"
                                      },
                                      "playlistId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlistId"
                                      },
                                      "videoOwnerChannelId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.videoOwnerChannelId"
                                      },
                                      "videoPublishedAt": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.videoPublishedAt"
                                      },
                                      "description": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.description"
                                      },
                                      "default_language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.default_language"
                                      },
                                      "localizations": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.localizations"
                                      },
                                      "playlist_item_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_item_id"
                                      },
                                      "playlist_owner_channel_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_owner_channel_id"
                                      },
                                      "playlist_owner_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_owner_title"
                                      },
                                      "channel_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.channel_id"
                                      },
                                      "published_label": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.published_label"
                                      },
                                      "published_precision": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.published_precision"
                                      },
                                      "title_maybe_translated": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.title_maybe_translated"
                                      },
                                      "video_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.video_count"
                                      },
                                      "posts_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "`/v1/instagram/hashtag` only: the exact number of public posts Instagram counts under the hashtag. Live: it moves between calls minutes apart."
                                      },
                                      "commerce": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.commerce"
                                      },
                                      "on_screen_texts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.on_screen_texts",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.on_screen_texts"
                                        }
                                      },
                                      "topic_tag": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.topic_tag"
                                      },
                                      "reshare_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.reshare_count"
                                      },
                                      "dsp_ids": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.dsp_ids"
                                      },
                                      "topic_tag_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.topic_tag_id"
                                      },
                                      "amazon_shop_lists": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_lists",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_lists"
                                        }
                                      },
                                      "amazon_shop_trending_picks": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_trending_picks",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_trending_picks"
                                        }
                                      },
                                      "amazon_shop_curations": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_curations",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_curations"
                                        }
                                      },
                                      "amazon_shop_socials": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_socials",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.amazon_shop_socials"
                                        }
                                      },
                                      "ad": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Ad Library envelope (Facebook `adlibrary/ad` and `adlibrary/company/ads` items): page_id, currency, spend, reach_estimate, publisher_platforms, categories, targeted_or_reached_countries, cta_text, cta_type, link_url, is_active, end_date_iso, display_format, title, video_hd_url, video_sd_url. Absent on every non-ad surface."
                                      },
                                      "apple_music": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.apple_music"
                                      },
                                      "feedback_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.feedback_id"
                                      },
                                      "question_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN (`/v1/naver/kin/search`) only: the question's id (Naver's `docId`), read from the row's link. Kin returns one row per answer, so several rows can share it; send `group=question` for one row per question."
                                      },
                                      "answer_no": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN only: which answer of the question this row is (Naver's `answerNo`), read from the row's link."
                                      },
                                      "answer_nos": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN with `group=question` only: every answer number of the question that was on the page, best-ranked first.",
                                        "items": {
                                          "type": "integer",
                                          "description": "Naver KnowledgeiN with `group=question` only: every answer number of the question that was on the page, best-ranked first."
                                        }
                                      },
                                      "published_at_est": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN only: the question's date ESTIMATED from its id (`YYYY-MM-DD`, Korea time), never a published date, so `published_at` stays null. Absent for questions older than the calibration table."
                                      },
                                      "date_basis": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "How `post.ext.published_at_est` was derived. `kin_docid_estimate`: interpolated from the question id against question pages whose posted date was read."
                                      },
                                      "event": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.event"
                                      },
                                      "trend": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Trend-board envelope: what TikTok's own trend board says about the row. On `/v1/tiktok/hashtags/popular`: `rank`, `country_code`, `period_days`, `posts` and `views` for the window (not lifetime totals), `industry` / `industry_id` / `industry_label` for the first board the hashtag was read from (null for the overall board), `boards` listing EVERY board it ranks on as `{ industry, industry_id, industry_label, rank }` in board order (so a hashtag in the top 3 overall and on an industry board shows both), `popularity_curve` as `{ date, value }` with value 0 to 100 relative to the window's peak, and `top_creators`. On `/v1/tiktok/videos/popular`: `rank`, `country_code`, `period_days`, `order_by`, `period_views`, `organic_views`, `engagement_rate`, `six_second_view_through_rate`, `content_tags`. Absent on every non-board surface."
                                      },
                                      "updated_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.updated_at"
                                      },
                                      "alt_text": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.alt_text"
                                      },
                                      "board_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.board_name"
                                      }
                                    }
                                  }
                                }
                              },
                              "computed": {
                                "type": "object",
                                "description": "Server-computed analytics fields (consistent across platforms)",
                                "properties": {
                                  "engagement_rate": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Computed engagement rate (0..1). Null when the upstream lacks enough signal."
                                  },
                                  "language": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "ISO 639-1 language code detected from the post text. Null when undetectable."
                                  },
                                  "content_category": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Keyword-classified content category (e.g. tech, food, gaming). Null when undetectable."
                                  },
                                  "estimated_reach": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Estimated reach based on views or follower count. Null when uncomputable."
                                  },
                                  "save_rate": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Numeric at computed.save_rate"
                                  },
                                  "relevance": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Nested object: computed.relevance",
                                    "properties": {
                                      "p": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.p"
                                      },
                                      "sense": {
                                        "type": "string",
                                        "description": "Leaf at computed.relevance.sense"
                                      },
                                      "depth": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.depth"
                                      },
                                      "spam": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.spam"
                                      }
                                    }
                                  },
                                  "labels": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Leaf at computed.labels"
                                  },
                                  "labels_evidence": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Leaf at computed.labels_evidence"
                                  }
                                }
                              }
                            }
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "reddit",
                  "endpoint": "/v1/reddit/search",
                  "data": {
                    "items": [
                      {
                        "post": {
                          "id": "1wrckhp",
                          "url": "https://www.reddit.com/r/ClaudeAI/comments/1wrckhp/what_tool_have_you_built_for_yourself_with_claude/",
                          "content": {
                            "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                            "media_urls": null,
                            "thumbnail_url": null,
                            "duration_seconds": null
                          },
                          "author": {
                            "username": "user_1c226d",
                            "display_name": "user_37da46",
                            "avatar_url": "https://example.com/avatars/user_246eb3.png",
                            "verified": null
                          },
                          "engagement": {
                            "views": null,
                            "likes": 1183,
                            "comments": 581,
                            "shares": null,
                            "saves": null
                          },
                          "flags": {
                            "nsfw": false,
                            "spoiler": false,
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2026-09-27T06:12:55.000Z",
                          "ext": {
                            "subreddit": "ClaudeAI",
                            "title": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                            "selftext": "I built a tool that reads emails from my kid’s school and other activities (swimming, music classes, scouts) etc and then: - Adds them to our shared calendar- Sends us a WhatsApp message to remind us the day before of what to pack in his school bag- Tells us what is on his lunch menu (helps us to avoid making the same dinner for him as he would have had for lunch) This all saves so much headache and head space in our daily routine. No more flapping around in the morning!!! I’ve also build tools that help with invoicing and proposals for example. Those have single-handedly removed a lot of daily frustration and friction. For example sometimes I wouldn’t bid on a job because I knew it would take a few hours of my day to write the proposal. And that would leave money on the table. Not it takes 5 mins and more work is coming in as a result simply because more proposals are going through the door. I’d I love to hear what you guys are making and things that really help you out. My main aim is to get my evenings and weekends back and be able to spend more time with my family whilst still scaling my business. Maybe they are lofty goals!!",
                            "upvote_ratio": 0.9750402576489533,
                            "flair": "Claude Code Workflow",
                            "content_language": "en",
                            "published_at_epoch": 1790489575
                          }
                        },
                        "computed": {
                          "engagement_rate": null,
                          "language": "en",
                          "content_category": "food",
                          "estimated_reach": null,
                          "relevance": {
                            "p": 0.95,
                            "sense": "target",
                            "depth": 1.52,
                            "spam": 0.18
                          },
                          "labels": {
                            "sponsored": {
                              "p": 0.04,
                              "disclosed": false,
                              "undisclosed": false,
                              "brand": null
                            },
                            "intent": {
                              "label": "other",
                              "confidence": 0.55,
                              "buyer": false,
                              "seller": 0.06,
                              "fits_offer": null,
                              "urgency": 0.4
                            },
                            "niche": {
                              "label": "technology",
                              "confidence": 0.89,
                              "taxonomy": "sc-niche-v1"
                            }
                          }
                        }
                      },
                      {
                        "post": {
                          "id": "1wqnn5x",
                          "url": "https://www.reddit.com/r/ClaudeAI/comments/1wqnn5x/claude_code_users_are_getting_up_to_250_in_free/",
                          "content": {
                            "text": "Sample comment text (redacted).",
                            "media_urls": "https://madrobot.blog/2026/09/24/claude-code-cloud-sessions-free-credit-how-to-claim/",
                            "thumbnail_url": "https://external-preview.redd.it/a5YzxKLxe6DjLWqf21T52VT5R2_j8clQxEGkWpNkADY.jpeg?auto=webp&s=c739062d30747aaa35f78bfb4348eff896509a17",
                            "duration_seconds": null
                          },
                          "author": {
                            "username": "user_15284e",
                            "display_name": "user_72b766",
                            "avatar_url": "https://example.com/avatars/user_d9b374.png",
                            "verified": null
                          },
                          "engagement": {
                            "views": null,
                            "likes": 110,
                            "comments": 53,
                            "shares": null,
                            "saves": null
                          },
                          "flags": {
                            "nsfw": false,
                            "spoiler": false,
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2026-09-26T10:58:20.000Z",
                          "ext": {
                            "subreddit": "ClaudeAI",
                            "title": "Sample comment text (redacted).",
                            "selftext": "Don't forget to claim it guys!",
                            "upvote_ratio": 0.8089887640449438,
                            "flair": "Promotion",
                            "content_language": "en",
                            "published_at_epoch": 1790420300
                          }
                        },
                        "computed": {
                          "engagement_rate": null,
                          "language": "en",
                          "content_category": "other",
                          "estimated_reach": null,
                          "relevance": {
                            "p": 0.89,
                            "sense": "target",
                            "depth": 0.96,
                            "spam": 0.85
                          },
                          "labels": null
                        }
                      }
                    ],
                    "next_cursor": "sc2.eyJzIjoicCIsImMiOiJzYzEuZXlKaklqb2lUV3BSUFNJc0luTWlPbHNpTVhkeVkydG9jQ0lzSWpGM2NXNXVOWGdpTENJeGQzSmpiV3B1SWl3aU1YZG5lalpzWmlJc0lqRjNjakZ6TjNvaUxDSXhkelZtTTJKNElpd2lNWGR3TmpCaGVTSXNJakYzYUdkbGRYa2lMQ0l4ZHpONFpHOXBJaXdpTVhaMmJ6RmhOU0lzSWpGM2JITTVkV3dpTENJeGQyZzNhWE5ySWl3aU1YUjRkV05pWVNJc0lqRjJhblZ5Y1hvaUxDSXhkMlF6Tlc5M0lpd2lNWFZ5ZW5JeGNTSXNJakYzT0dVMmFUVWlMQ0l4ZDI5MmQyRnZJaXdpTVhacWRqTjZPQ0lzSWpGMWNURXdPV2tpTENJeGMzQndaM2RrSWl3aU1YWmhjbWcyYVNJc0lqRjJkSG80TlhBaUxDSXhkM0F5WlRCMElpd2lNWFoyWVRoeGVTSmRmUSJ9",
                    "total": null,
                    "relevance": {
                      "mode": "score",
                      "topic_source": "query",
                      "rows": 25,
                      "scored": 25,
                      "cached": 0,
                      "kept": 25,
                      "dropped": 0,
                      "dropped_ids": [],
                      "unjudged": 0,
                      "too_short": 0,
                      "threshold": 0.5,
                      "extra_credits": 0,
                      "methodology_version": "relevance/2",
                      "origin": "default",
                      "pending": 0,
                      "pending_ids": [],
                      "status": "complete"
                    },
                    "labels": {
                      "presets": [
                        "sponsored",
                        "intent"
                      ],
                      "rows": 25,
                      "labelled": 3,
                      "cached": 3,
                      "skipped": 0,
                      "unjudged": 0,
                      "dropped": 0,
                      "dropped_ids": [],
                      "extra_credits": 0,
                      "methodology_version": "labels/1",
                      "mode": "default",
                      "status": "partial",
                      "pending": 22,
                      "pending_ids": [
                        "1wqnn5x",
                        "1wrcmjn"
                      ]
                    },
                    "dropped": 0
                  },
                  "credits_used": 1,
                  "request_id": "req_example000000",
                  "cached": false,
                  "pagination": {
                    "next_cursor": "sc.eyJ2IjoyLCJjIjoic2MyLmV5SnpJam9pY0NJc0ltTWlPaUp6WXpFdVpYbEtha2xxYjJsVVYzQlNVRk5KYzBsdVRXbFBiSE5wVFZoa2VWa3lkRzlqUTBselNXcEdNMk5YTlhWT1dHZHBURU5KZUdRelNtcGlWM0IxU1dsM2FVMVlaRzVsYWxweldtbEpjMGxxUmpOamFrWjZUak52YVV4RFNYaGtlbFp0VFRKS05FbHBkMmxOV0dSM1RtcENhR1ZUU1hOSmFrWXpZVWRrYkdSWWEybE1RMGw0WkhwT05GcEhPWEJKYVhkcFRWaGFNbUo2Um1oT1UwbHpTV3BHTTJKSVRUVmtWM2RwVEVOSmVHUXlaek5oV0U1eVNXbDNhVTFZVWpSa1YwNXBXVk5KYzBscVJqSmhibFo1WTFodmFVeERTWGhrTWxGNlRsYzVNMGxwZDJsTldGWjVaVzVKZUdOVFNYTkpha1l6VDBkVk1tRlVWV2xNUTBsNFpESTVNbVF5Um5aSmFYZHBUVmhhY1dScVRqWlBRMGx6U1dwR01XTlVSWGRQVjJ0cFRFTkplR016UW5kYU0yUnJTV2wzYVUxWVdtaGpiV2N5WVZOSmMwbHFSakprU0c4MFRsaEJhVXhEU1hoa00wRjVXbFJDTUVscGQybE5XRm95V1ZSb2VHVlRTbVJtVVNKOSIsImUiOiJyZWRkaXQvc2VhcmNoIiwicCI6ImFmdGVyIn0",
                    "has_more": true,
                    "page_size": 25
                  },
                  "credits_remaining": 9999,
                  "source": "captured",
                  "captured_at": "2026-10-02T07:26:20.953Z",
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/reddit/post": {
      "get": {
        "summary": "Get a Reddit post",
        "description": "Returns a single Reddit post from its URL, including the post BODY (selftext). `content.text` is the title and body joined, matching how posts read on `/v1/reddit/subreddit`; `ext.title` and `ext.selftext` carry the two halves separately. Also returns score, comment count, author, author avatar, images or video, thumbnail, and creation timestamp. `engagement.shares` carries Reddit's share count. `ext.selftext` is null on link posts, which have no body. For the post's comments use `/v1/reddit/post/comments`.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_post",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 1,
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Full URL of the Reddit post",
            "schema": {
              "type": "string"
            },
            "example": "https://www.reddit.com/r/NoteTaking/comments/1o9s55r/i_tried_all_popular_ai_notetaking_apps_so_you/"
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/post"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Platform-specific post ID (always a string; numeric upstream IDs are stringified)"
                        },
                        "url": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Direct URL to the post on the source platform"
                        },
                        "content": {
                          "type": "object",
                          "description": "Post content fields (text, media, thumbnail, duration)",
                          "properties": {
                            "text": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Post caption, description, or text content"
                            },
                            "media_urls": {
                              "type": [
                                "string",
                                "array",
                                "null"
                              ],
                              "description": "URL(s) of the primary media. Single string for video/photo posts; array of strings for carousels.",
                              "items": {
                                "type": "string",
                                "description": "URL(s) of the primary media. Single string for video/photo posts; array of strings for carousels."
                              }
                            },
                            "thumbnail_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "URL to thumbnail image"
                            },
                            "duration_seconds": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Video/clip duration in seconds (null for non-video posts)"
                            }
                          }
                        },
                        "author": {
                          "type": "object",
                          "description": "Subset of Author fields for the post creator",
                          "properties": {
                            "username": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Author username"
                            },
                            "display_name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Author display name"
                            },
                            "avatar_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "URL to author profile picture"
                            },
                            "verified": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Whether the author account is verified"
                            }
                          }
                        },
                        "engagement": {
                          "type": "object",
                          "description": "Engagement counts",
                          "properties": {
                            "views": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "View count (if available). For Instagram video/reels this is the play count: the headline 'Views' the IG app shows. Instagram removed per-post play counts from its public web pages in August 2026, so `GET /v1/instagram/post` now fills the count automatically from a second source within the same call: videos and reels keep a numeric `views` with no extra endpoint or workaround. Note: since mid-July 2026 Instagram's play count is Instagram-only. It no longer includes Facebook crosspost views (Meta-side change; the app UI changed identically). For combined reach, also fetch the Facebook crosspost via `/v1/facebook/post`."
                            },
                            "likes": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Like / reaction count"
                            },
                            "comments": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Comment count. Note: on `GET /v1/instagram/post` this is Instagram's `edge_media_to_parent_comment.count` (top-level comments); the IG list endpoints report the mobile `comment_count` total (includes replies). Both land on this same field."
                            },
                            "shares": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Share / repost / retweet count. On Instagram this is `reshare_count` (the paper-plane Share / Send count) and it exists only on Instagram's mobile surface, so it is returned by `/v1/instagram/post/stats`, `/v1/instagram/profile/reels/full`, and `/v1/instagram/profile/posts/full`. The web-sourced Instagram list and search endpoints return `null` (never fabricated)."
                            },
                            "saves": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Save / bookmark count. `null` on Instagram: the save count is platform-private and Instagram exposes no numeric save metric on any surface (never fabricated)."
                            }
                          }
                        },
                        "flags": {
                          "type": "object",
                          "description": "Boolean flags on the post",
                          "properties": {
                            "nsfw": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "NSFW flag (null when platform does not surface)"
                            },
                            "spoiler": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Spoiler flag (null when platform does not surface)"
                            },
                            "pinned": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Pinned-to-profile flag (null when platform does not surface)"
                            },
                            "deleted": {
                              "type": "boolean",
                              "description": "Whether the post is tombstoned (always present)"
                            },
                            "likes_hidden": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Present and `true` when the creator has hidden the like count. `engagement.likes` is `null` in that case (never the platform's decoy preview number). Absent on normal posts."
                            },
                            "comments_hidden": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Present and `true` when the upstream reports the comment count as hidden. `engagement.comments` is `null` in that case. Absent on normal posts."
                            },
                            "shares_hidden": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at post.flags.shares_hidden"
                            },
                            "views_hidden": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at post.flags.views_hidden"
                            },
                            "saves_hidden": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at post.flags.saves_hidden"
                            }
                          }
                        },
                        "published_at": {
                          "type": [
                            "string",
                            "integer",
                            "null"
                          ],
                          "description": "Post creation timestamp as an ISO 8601 UTC string. When the upstream sent a Unix epoch it is converted here and the raw epoch is preserved under `post.ext.published_at_epoch` for one deprecation cycle."
                        },
                        "ext": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Platform-specific passthrough fields for cross-endpoint chains (present only on platforms that surface them)",
                          "properties": {
                            "music_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "TikTok music/clip id (exact string): pass to `/v1/tiktok/song/videos?clipId=` to find videos using the same sound"
                            },
                            "matched_song_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "TikTok only. The catalogue song TikTok matched the video's sound to, as an exact digit string. An official clip and the original sounds creators upload with it have different `music_id` values and the same `matched_song_id`, so group rows on it to count every use of one song. It is not a clipId: `/v1/tiktok/song` and `/v1/tiktok/song/videos` do not accept it. `/v1/tiktok/search/music` carries it on each sound, so a search on the song's title and artist, kept to the sounds with the same `matched_song_id`, gives the song's official sounds and their `video_count`. Absent when TikTok matched the sound to no song, and on rows served from a source that does not report the match."
                            },
                            "matched_song_title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "TikTok only. The title of the song in `matched_song_id`. Absent when there is no matched song."
                            },
                            "matched_song_artist": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "TikTok only. The artist of the song in `matched_song_id`, as TikTok's catalogue names it. Absent when there is no matched song."
                            },
                            "music_title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "TikTok only. The title of the video's own sound (`music_id`). An uploaded sound is titled like `original sound - <handle>`; the song it plays, when TikTok recognised one, is `matched_song_title`."
                            },
                            "music_artist": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "TikTok only. The artist TikTok shows for the video's own sound. On an original sound this is the uploader's display name, not the song's artist; use `matched_song_artist` for that."
                            },
                            "music_is_original": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "TikTok only. `true` when the video's sound is an original sound a creator uploaded, `false` when it is a catalogue track. Absent when the source does not say."
                            },
                            "author_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The creator's platform-native numeric user id. On TikTok search and list items, pass to `/v1/tiktok/profile?user_id=` for the creator's current follower count (survives username changes). On Instagram `/v1/instagram/search/reels`, `/v1/instagram/search/hashtag` and `/v1/instagram/location/posts` items it is present on every row, accepted by `/v1/instagram/profile/country?user_id=` and `/v1/instagram/basic-profile?userId=`. On Facebook it appears when the upstream exposed a numeric actor id and no real handle."
                            },
                            "author_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The posting account's profile URL, so a matching post can be followed to its account. Present on `/v1/facebook/search/posts` rows: the vanity or `/people/<name>/<id>/` URL when Facebook sends one, otherwise `https://www.facebook.com/profile.php?id=<numeric id>` built from the account id. Pass it as `url` to `/v1/facebook/profile` (or to `/v1/prism/profiles` with `platform: facebook`). Null when the row names neither an account URL nor a numeric account id. Absent on other endpoints."
                            },
                            "author_followers": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "The creator's follower count as embedded in the search payload itself, when the search source happens to carry one. On Instagram `search/reels` it is null on a plain call, because Instagram stopped sending follower counts in its search payload in August 2026; send `include=creator` (or `country`) and it is filled from the creator's profile, 2 credits per creator looked up. It stays null when that lookup does not resolve."
                            },
                            "author_following": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at post.ext.author_following"
                            },
                            "author_posts_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at post.ext.author_posts_count"
                            },
                            "author_location": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The free text the author wrote in their profile's location field, exactly as written (for example `Johannesburg, South Africa`). It is not a country code and is not checked. Present on X tweet and reply rows; null or absent when the author left it blank."
                            },
                            "in_reply_to_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.in_reply_to_id"
                            },
                            "in_reply_to_username": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.in_reply_to_username"
                            },
                            "conversation_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.conversation_id"
                            },
                            "author_country": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The creator's country. On Instagram it is the country the creator declares on the About this account panel, as a country name (for example `Spain`), and it is not where the post was filmed. It is present on `/v1/instagram/search/reels` when the request sends `include=creator`, `include=country` or `country`, and on `/v1/instagram/search/hashtag` and `/v1/instagram/location/posts` when it sends `include=country`, filled by looking the creator up. On YouTube rows joined with `include=channel` it is the channel's own country as an ISO 3166-1 alpha-2 code (for example `ZA`). Null when the platform publishes no country for the creator or the lookup did not resolve, and nothing is guessed; absent on a plain call."
                            },
                            "author_public_email": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The public contact email on the creator's profile. Present only on `/v1/instagram/search/reels` when the request sends `include=creator`, filled by looking the creator up. Null when the creator lists no public email or the lookup did not resolve; absent on a plain call."
                            },
                            "author_public_phone": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The public contact phone number on the creator's profile. Present only on `/v1/instagram/search/reels` when the request sends `include=creator`, filled by looking the creator up. Null when the creator lists no public phone or the lookup did not resolve; absent on a plain call."
                            },
                            "download_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "How many times the video has been saved to a device. TikTok only, and distinct from `engagement.saves`: a save keeps the video in a private collection on the platform, a download takes a copy off it, and TikTok counts the two separately. Present on TikTok post, search and post-list responses; absent everywhere else."
                            },
                            "region": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "TikTok only: the country TikTok registers the video to, as an ISO 3166-1 alpha-2 code (normally the creator's account country when they posted). It is not the viewer's country, not the `region` you requested, and not a language. On `/v1/tiktok/trending`, `/v1/tiktok/search`, `/v1/tiktok/search/top`, `/v1/tiktok/profile/videos`, `/v1/tiktok/search/hashtag` and `/v1/tiktok/song/videos` it is how you tell which rows are from a given country: filter on it when you need only that country. A row whose source omits the country stays null. The `region` request parameter still only sets the proxy."
                            },
                            "subreddit": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Reddit subreddit name (search/list items): pass to `/v1/reddit/subreddit/details?subreddit=`"
                            },
                            "title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.title"
                            },
                            "selftext": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.selftext"
                            },
                            "upvote_ratio": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Reddit only: the share of a post's votes that are upvotes, as a fraction from 0 to 1 and usually close to 1 (six live rows measured 1, 1, 1, 0.86, 0.75, 1). Fractional despite the integer type this schema emits for every numeric leaf, the same caveat as `author.ext.average_rating`. Populated on `/v1/reddit/search` rows whose source carries it, and null everywhere else on Reddit including `/v1/reddit/post` and `/v1/reddit/subreddit`."
                            },
                            "flair": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.flair"
                            },
                            "content_language": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "The language the platform itself tags the post with, when it sends one: Reddit's own language tag on Reddit lanes, and TikTok's caption-language tag (for example `de`) on `/v1/tiktok/trending?feed=local`. Null when the platform could not tell (Reddit `und`, TikTok `un`, common on short or emoji-only captions); absent where the source sends no tag. Never inferred from the text by us: that is `post.computed.language`."
                            },
                            "type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.type"
                            },
                            "content_type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at post.ext.content_type"
                            },
                            "ticker_symbols": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.ticker_symbols",
                              "items": {
                                "type": "string",
                                "description": "String at post.ext.ticker_symbols"
                              }
                            },
                            "video_view_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Instagram's legacy 3-second-view count. Historical: Instagram stopped serving it in August 2026 (removed from its web post surface along with the web play count), so fresh `/v1/instagram/post` lookups no longer carry it and no source can restore it. Use `engagement.views` (the play count) instead."
                            },
                            "ig_play_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Instagram-only play count (`ig_play_count`). Since mid-July 2026 Instagram's headline play count (`engagement.views`) no longer includes Facebook crosspost views and equals this value; it is surfaced explicitly so you can tell the Instagram-only figure apart and detect any future re-divergence. For combined Instagram + Facebook reach, also fetch the Facebook crosspost via `/v1/facebook/post`. Present on `/v1/instagram/post/stats` and, since the August 2026 views fix, on `/v1/instagram/post` for video posts."
                            },
                            "repost_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at post.ext.repost_count"
                            },
                            "media_type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at post.ext.media_type"
                            },
                            "text_truncated": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at post.ext.text_truncated"
                            },
                            "ip_location": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.ip_location"
                            },
                            "carousel_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at post.ext.carousel_count"
                            },
                            "remix_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at post.ext.remix_count"
                            },
                            "audio_cluster_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Instagram's audio cluster for a reel, as an exact digit string: the id Instagram uses to group different uploads of the same sound. Present on `/v1/instagram/audio/reels` rows and on `/v1/instagram/profile/reels` with `include=stats`; absent on a row when it is not available and on every other surface."
                            },
                            "facebook_likes": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Instagram only: the Facebook cross-post share that was EXCLUDED from `engagement.likes` on this row. A post shared to Facebook arrives from some sources with its Facebook likes already folded into the Instagram count, so the share is subtracted and published here, which keeps `engagement.likes` the Instagram-only figure instagram.com shows on the post. Add the two together for the combined number. Absent when the read carried no Facebook share, and absent on a post whose owner hides the like count, because nothing can be subtracted from a null. A response that excluded a share also carries a note in `data._warnings`."
                            },
                            "facebook_comments": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Instagram only: the Facebook cross-post share that was EXCLUDED from `engagement.comments` on this row, the comment counterpart of `post.ext.facebook_likes`. Each leaf appears only for the count it actually changed, so a post whose likes are hidden but whose comments were reconciled carries this one alone."
                            },
                            "instagram_views": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Instagram only: the Instagram-only play count of a video, the same figure on every Instagram endpoint. `engagement.views` keeps each endpoint's established meaning: on `/v1/instagram/profile/reels`, `/v1/instagram/audio/reels`, `/v1/instagram/search/reels` and `/v1/instagram/search/hashtag` it can include the post's Facebook cross-post views, while on `/v1/instagram/post` and `/v1/instagram/post/stats` it is Instagram-only. Read this leaf when you compare one post across endpoints. Absent on photos and when the source did not report the Instagram-only figure."
                            },
                            "facebook_views": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Instagram only: the Facebook cross-post part of a video's play count, the counterpart of `post.ext.instagram_views`. Present only when the source reported the Facebook part, or a combined total above the Instagram figure. Absent does not mean zero: some sources report the Instagram figure alone even for a cross-posted video."
                            },
                            "published_at_epoch": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Raw Unix epoch for `published_at` (seconds, or milliseconds when the upstream sent millis). Present only when the upstream sent a numeric epoch that was normalised to the ISO 8601 `published_at` string. Kept for one deprecation cycle for integrations pinned to the numeric form."
                            },
                            "usertags": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.usertags",
                              "items": {
                                "type": "string",
                                "description": "Leaf at post.ext.usertags"
                              }
                            },
                            "coauthors": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Instagram collaborative posts (the native \"Collab\" feature). The full list of co-author accounts on the post, as `{ id, username, full_name, is_verified, profile_pic_url }`. A collab post has ONE producer and appears in every co-author's grid, so `post.author` is whichever account created it, which is not necessarily the profile you queried. The complete set of accounts on a post is `post.author.username` plus every `username` in this array. An empty array means Instagram reports the post as NOT a collab; the field is absent on surfaces that carry no co-author signal, including `/v1/instagram/post` (its web source ships the field permanently empty, so use `/v1/instagram/post/stats` for a single post).",
                              "items": {
                                "type": "string",
                                "description": "Instagram collaborative posts (the native \"Collab\" feature). The full list of co-author accounts on the post, as `{ id, username, full_name, is_verified, profile_pic_url }`. A collab post has ONE producer and appears in every co-author's grid, so `post.author` is whichever account created it, which is not necessarily the profile you queried. The complete set of accounts on a post is `post.author.username` plus every `username` in this array. An empty array means Instagram reports the post as NOT a collab; the field is absent on surfaces that carry no co-author signal, including `/v1/instagram/post` (its web source ships the field permanently empty, so use `/v1/instagram/post/stats` for a single post)."
                              }
                            },
                            "music": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at post.ext.music"
                            },
                            "sponsor_tags": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Instagram only: the brand accounts the post tags as its paid partner, as usernames (`[\"rolex\"]`). `[]` on a post with no partner tagged. Present on `/v1/instagram/post/stats`; absent on every other endpoint.",
                              "items": {
                                "type": "string",
                                "description": "Instagram only: the brand accounts the post tags as its paid partner, as usernames (`[\"rolex\"]`). `[]` on a post with no partner tagged. Present on `/v1/instagram/post/stats`; absent on every other endpoint."
                              }
                            },
                            "sponsored_disclosed": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "The platform's own disclosure that the post is paid or promotional: on Instagram the paid-partnership label (`is_paid_partnership`) or a tagged brand partner, on TikTok the label TikTok shows viewers (\"Paid partnership\", \"Commission paid\", \"Promotional content\"). `false` when the post carries the flag unset, null when it carries none. Present on `/v1/instagram/post/stats`, `/v1/instagram/search/reels` and `/v1/tiktok/search`; absent on every other endpoint."
                            },
                            "ai_label": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Instagram only: Instagram's AI-content label on the post, as the method Instagram reports: `classifier_score_high` (Instagram detected it, shown as \"Likely made with AI\"), `ai_created` or `ai_edited` (declared or detected as made or edited with AI). Null when the post carries no AI label. Present on `/v1/instagram/post/stats`; absent on every other endpoint."
                            },
                            "story_mentions": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Instagram stories only: the accounts the story mentions with a mention sticker, as usernames in alphabetical order. `[]` when it mentions nobody. Present on `/v1/instagram/stories`; absent on every other endpoint.",
                              "items": {
                                "type": "string",
                                "description": "Instagram stories only: the accounts the story mentions with a mention sticker, as usernames in alphabetical order. `[]` when it mentions nobody. Present on `/v1/instagram/stories`; absent on every other endpoint."
                              }
                            },
                            "story_links": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Instagram stories only: where the story's link stickers lead, as URLs in alphabetical order. Instagram wraps each link in its own redirect with a per-view click id; both are removed, so this is the destination itself. `[]` when the story has no link sticker. Present on `/v1/instagram/stories` and `/v1/instagram/highlight/detail`; absent on every other endpoint.",
                              "items": {
                                "type": "string",
                                "description": "Instagram stories only: where the story's link stickers lead, as URLs in alphabetical order. Instagram wraps each link in its own redirect with a per-view click id; both are removed, so this is the destination itself. `[]` when the story has no link sticker. Present on `/v1/instagram/stories` and `/v1/instagram/highlight/detail`; absent on every other endpoint."
                              }
                            },
                            "story_reshared_posts": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Instagram stories only: the feed posts the story reshares, as post URLs (`https://www.instagram.com/p/{shortcode}/`, which `/v1/instagram/post` takes). `[]` when it reshares none. Present on `/v1/instagram/stories`; absent on every other endpoint.",
                              "items": {
                                "type": "string",
                                "description": "Instagram stories only: the feed posts the story reshares, as post URLs (`https://www.instagram.com/p/{shortcode}/`, which `/v1/instagram/post` takes). `[]` when it reshares none. Present on `/v1/instagram/stories`; absent on every other endpoint."
                              }
                            },
                            "location": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at post.ext.location"
                            },
                            "media": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.media",
                              "items": {
                                "type": "object",
                                "description": "Nested object: post.ext.media",
                                "properties": {
                                  "type": {
                                    "type": "string",
                                    "description": "Leaf at post.ext.media.type"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at post.ext.media.url"
                                  },
                                  "width": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Numeric at post.ext.media.width"
                                  },
                                  "height": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Numeric at post.ext.media.height"
                                  }
                                }
                              }
                            },
                            "top_comments": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.top_comments",
                              "items": {
                                "type": "object",
                                "description": "Nested object: post.ext.top_comments",
                                "properties": {
                                  "id": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at post.ext.top_comments.id"
                                  },
                                  "text": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at post.ext.top_comments.text"
                                  },
                                  "username": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at post.ext.top_comments.username"
                                  },
                                  "likes": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Numeric at post.ext.top_comments.likes"
                                  },
                                  "published_at": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at post.ext.top_comments.published_at"
                                  }
                                }
                              }
                            },
                            "hashtags": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.hashtags",
                              "items": {
                                "type": "string",
                                "description": "String at post.ext.hashtags"
                              }
                            },
                            "mentions": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.mentions",
                              "items": {
                                "type": "string",
                                "description": "String at post.ext.mentions"
                              }
                            },
                            "mentioned_user_ids": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.mentioned_user_ids",
                              "items": {
                                "type": "string",
                                "description": "String at post.ext.mentioned_user_ids"
                              }
                            },
                            "quoted_post": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Threads quote posts: the post this one quotes, as `{ id, url, author: { id, username }, text, media_urls, thumbnail_url }`. A quote post usually carries no caption or media of its own, and the text and video you see on the post's page belong to this attachment, by a different author. It is returned here rather than merged into `post.content`, so `content.*` always stays the outer post's own content and one account's media is never attributed to another. Absent on posts that are not quote posts."
                            },
                            "retweeted_post": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at post.ext.retweeted_post"
                            },
                            "quote_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at post.ext.quote_count"
                            },
                            "all_media_urls": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.all_media_urls",
                              "items": {
                                "type": "string",
                                "description": "String at post.ext.all_media_urls"
                              }
                            },
                            "reaction_counts": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.reaction_counts",
                              "items": {
                                "type": "string",
                                "description": "Leaf at post.ext.reaction_counts"
                              }
                            },
                            "share_urn": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.share_urn"
                            },
                            "post_type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.post_type"
                            },
                            "activity_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.activity_id"
                            },
                            "published_at_precision": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.published_at_precision"
                            },
                            "author_urn": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.author_urn"
                            },
                            "author_headline": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.author_headline"
                            },
                            "author_type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.author_type"
                            },
                            "is_repost_quote": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at post.ext.is_repost_quote"
                            },
                            "article": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at post.ext.article"
                            },
                            "reaction_type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.reaction_type"
                            },
                            "download_media_urls": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.download_media_urls",
                              "items": {
                                "type": "string",
                                "description": "Leaf at post.ext.download_media_urls"
                              }
                            },
                            "tags": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.tags",
                              "items": {
                                "type": "string",
                                "description": "String at post.ext.tags"
                              }
                            },
                            "categoryId": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.categoryId"
                            },
                            "categoryTitle": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.categoryTitle"
                            },
                            "topicCategories": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.topicCategories",
                              "items": {
                                "type": "string",
                                "description": "String at post.ext.topicCategories"
                              }
                            },
                            "duration": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.duration"
                            },
                            "license": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.license"
                            },
                            "madeForKids": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at post.ext.madeForKids"
                            },
                            "defaultAudioLanguage": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.defaultAudioLanguage"
                            },
                            "hasPaidProductPlacement": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at post.ext.hasPaidProductPlacement"
                            },
                            "caption": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.caption"
                            },
                            "position": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at post.ext.position"
                            },
                            "playlistId": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.playlistId"
                            },
                            "videoOwnerChannelId": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.videoOwnerChannelId"
                            },
                            "videoPublishedAt": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.videoPublishedAt"
                            },
                            "description": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.description"
                            },
                            "default_language": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.default_language"
                            },
                            "localizations": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at post.ext.localizations"
                            },
                            "playlist_item_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.playlist_item_id"
                            },
                            "playlist_owner_channel_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.playlist_owner_channel_id"
                            },
                            "playlist_owner_title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.playlist_owner_title"
                            },
                            "channel_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.channel_id"
                            },
                            "published_label": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.published_label"
                            },
                            "published_precision": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at post.ext.published_precision"
                            },
                            "title_maybe_translated": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at post.ext.title_maybe_translated"
                            },
                            "video_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at post.ext.video_count"
                            },
                            "posts_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "`/v1/instagram/hashtag` only: the exact number of public posts Instagram counts under the hashtag. Live: it moves between calls minutes apart."
                            },
                            "commerce": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at post.ext.commerce"
                            },
                            "on_screen_texts": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.on_screen_texts",
                              "items": {
                                "type": "string",
                                "description": "String at post.ext.on_screen_texts"
                              }
                            },
                            "topic_tag": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.topic_tag"
                            },
                            "reshare_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at post.ext.reshare_count"
                            },
                            "dsp_ids": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at post.ext.dsp_ids"
                            },
                            "topic_tag_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.topic_tag_id"
                            },
                            "amazon_shop_lists": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.amazon_shop_lists",
                              "items": {
                                "type": "string",
                                "description": "Leaf at post.ext.amazon_shop_lists"
                              }
                            },
                            "amazon_shop_trending_picks": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.amazon_shop_trending_picks",
                              "items": {
                                "type": "string",
                                "description": "Leaf at post.ext.amazon_shop_trending_picks"
                              }
                            },
                            "amazon_shop_curations": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.amazon_shop_curations",
                              "items": {
                                "type": "string",
                                "description": "Leaf at post.ext.amazon_shop_curations"
                              }
                            },
                            "amazon_shop_socials": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at post.ext.amazon_shop_socials",
                              "items": {
                                "type": "string",
                                "description": "String at post.ext.amazon_shop_socials"
                              }
                            },
                            "ad": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Ad Library envelope (Facebook `adlibrary/ad` and `adlibrary/company/ads` items): page_id, currency, spend, reach_estimate, publisher_platforms, categories, targeted_or_reached_countries, cta_text, cta_type, link_url, is_active, end_date_iso, display_format, title, video_hd_url, video_sd_url. Absent on every non-ad surface."
                            },
                            "apple_music": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at post.ext.apple_music"
                            },
                            "feedback_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.feedback_id"
                            },
                            "question_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Naver KnowledgeiN (`/v1/naver/kin/search`) only: the question's id (Naver's `docId`), read from the row's link. Kin returns one row per answer, so several rows can share it; send `group=question` for one row per question."
                            },
                            "answer_no": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Naver KnowledgeiN only: which answer of the question this row is (Naver's `answerNo`), read from the row's link."
                            },
                            "answer_nos": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Naver KnowledgeiN with `group=question` only: every answer number of the question that was on the page, best-ranked first.",
                              "items": {
                                "type": "integer",
                                "description": "Naver KnowledgeiN with `group=question` only: every answer number of the question that was on the page, best-ranked first."
                              }
                            },
                            "published_at_est": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Naver KnowledgeiN only: the question's date ESTIMATED from its id (`YYYY-MM-DD`, Korea time), never a published date, so `published_at` stays null. Absent for questions older than the calibration table."
                            },
                            "date_basis": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "How `post.ext.published_at_est` was derived. `kin_docid_estimate`: interpolated from the question id against question pages whose posted date was read."
                            },
                            "event": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at post.ext.event"
                            },
                            "trend": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Trend-board envelope: what TikTok's own trend board says about the row. On `/v1/tiktok/hashtags/popular`: `rank`, `country_code`, `period_days`, `posts` and `views` for the window (not lifetime totals), `industry` / `industry_id` / `industry_label` for the first board the hashtag was read from (null for the overall board), `boards` listing EVERY board it ranks on as `{ industry, industry_id, industry_label, rank }` in board order (so a hashtag in the top 3 overall and on an industry board shows both), `popularity_curve` as `{ date, value }` with value 0 to 100 relative to the window's peak, and `top_creators`. On `/v1/tiktok/videos/popular`: `rank`, `country_code`, `period_days`, `order_by`, `period_views`, `organic_views`, `engagement_rate`, `six_second_view_through_rate`, `content_tags`. Absent on every non-board surface."
                            },
                            "updated_at": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.updated_at"
                            },
                            "alt_text": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.alt_text"
                            },
                            "board_name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at post.ext.board_name"
                            }
                          }
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      }
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "youtube",
                  "endpoint": "/v1/youtube/video",
                  "data": {
                    "post": {
                      "id": "dQw4w9WgXcQ",
                      "content": {
                        "text": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
                        "thumbnail_url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg",
                        "duration_seconds": 214,
                        "media_urls": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw"
                      },
                      "author": {
                        "username": "UCuAXFkgsw1L7xaCfnd5JJOw",
                        "display_name": "Rick Astley",
                        "avatar_url": null,
                        "verified": null
                      },
                      "engagement": {
                        "views": 1789065639,
                        "likes": 19216844,
                        "comments": 2443809,
                        "shares": null,
                        "saves": null
                      },
                      "published_at": "2009-10-25T06:57:33Z",
                      "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
                      "ext": {
                        "content_type": "video",
                        "tags": [
                          "rick astley",
                          "Never Gonna Give You Up",
                          "nggyu",
                          "never gonna give you up lyrics",
                          "rick rolled",
                          "Rick Roll",
                          "rick astley official",
                          "rickrolled",
                          "Fortnite song",
                          "Fortnite event",
                          "Fortnite dance",
                          "fortnite never gonna give you up",
                          "rick roll",
                          "rickrolling",
                          "rick rolling",
                          "never gonna give you up",
                          "80s music",
                          "rick astley new",
                          "animated video",
                          "rickroll",
                          "meme songs",
                          "never gonna give u up lyrics",
                          "Rick Astley 2022",
                          "never gonna let you down",
                          "animated",
                          "rick rolls 2022",
                          "never gonna give you up karaoke"
                        ],
                        "categoryId": "10",
                        "categoryTitle": "Music",
                        "topicCategories": [
                          "https://en.wikipedia.org/wiki/Electronic_music",
                          "https://en.wikipedia.org/wiki/Music",
                          "https://en.wikipedia.org/wiki/Pop_music",
                          "https://en.wikipedia.org/wiki/Rhythm_and_blues",
                          "https://en.wikipedia.org/wiki/Soul_music"
                        ],
                        "duration": "PT3M34S",
                        "license": "youtube",
                        "madeForKids": false,
                        "defaultAudioLanguage": "en",
                        "hasPaidProductPlacement": false,
                        "caption": "true",
                        "description": "The official video for “Never Gonna Give You Up” by Rick Astley. \n\nNever: The Autobiography 📚 OUT NOW! \nFollow this link to get your copy and listen to Rick’s ‘Never’ playlist ❤️ #RickAstleyNever\nhttps://linktr.ee/rickastleynever\n\n“Never Gonna Give You Up” was a global smash on its release in July 1987, topping the charts in 25 countries including Rick’s native UK and the US Billboard Hot 100.  It also won the Brit Award for Best single in 1988. Stock Aitken and Waterman wrote and produced the track which was the lead-off single and lead track from Rick’s debut LP “Whenever You Need Somebody”.  The album was itself a UK number one and would go on to sell over 15 million copies worldwide.\n\nThe legendary video was directed by Simon West – who later went on to make Hollywood blockbusters such as Con Air, Lara Croft – Tomb Raider and The Expendables 2.  The video passed the 1bn YouTube views milestone on 28 July 2021.\n\nSubscribe to the official Rick Astley YouTube channel: https://RickAstley.lnk.to/YTSubID\n\nFollow Rick Astley:\nFacebook: https://RickAstley.lnk.to/FBFollowID \nTwitter: https://RickAstley.lnk.to/TwitterID \nInstagram: https://RickAstley.lnk.to/InstagramID \nWebsite: https://RickAstley.lnk.to/storeID \nTikTok: https://RickAstley.lnk.to/TikTokID\n\nListen to Rick Astley:\nSpotify: https://RickAstley.lnk.to/SpotifyID \nApple Music: https://RickAstley.lnk.to/AppleMusicID \nAmazon Music: https://RickAstley.lnk.to/AmazonMusicID \nDeezer: https://RickAstley.lnk.to/DeezerID \n\nLyrics:\nWe’re no strangers to love\nYou know the rules and so do I\nA full commitment’s what I’m thinking of\nYou wouldn’t get this from any other guy\n\nI just wanna tell you how I’m feeling\nGotta make you understand\n\nNever gonna give you up\nNever gonna let you down\nNever gonna run around and desert you\nNever gonna make you cry\nNever gonna say goodbye\nNever gonna tell a lie and hurt you\n\nWe’ve known each other for so long\nYour heart’s been aching but you’re too shy to say it\nInside we both know what’s been going on\nWe know the game and we’re gonna play it\n\nAnd if you ask me how I’m feeling\nDon’t tell me you’re too blind to see\n\nNever gonna give you up\nNever gonna let you down\nNever gonna run around and desert you\nNever gonna make you cry\nNever gonna say goodbye\nNever gonna tell a lie and hurt you\n\n#RickAstley #NeverGonnaGiveYouUp #WheneverYouNeedSomebody #OfficialMusicVideo",
                        "default_language": "en"
                      },
                      "flags": {
                        "deleted": false,
                        "nsfw": null,
                        "spoiler": null,
                        "pinned": null
                      }
                    },
                    "computed": {
                      "engagement_rate": 0.012107,
                      "language": "en",
                      "content_category": "entertainment",
                      "estimated_reach": 2146878767
                    }
                  },
                  "credits_used": 1,
                  "credits_remaining": 9999,
                  "request_id": "req-8Kq2ZmR4vT9xLb3P",
                  "cached": false,
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/reddit/post/comments": {
      "get": {
        "summary": "List Reddit post comments",
        "description": "Returns the full threaded comment tree for a Reddit post. Nested replies are auto-expanded by following upstream pagination, so a single call returns the deep tree (not just top-level comments). Each comment includes the author, body, score, direct-reply count, creation timestamp, its nesting depth at `ext.depth`, and a recursive `replies[]` array. `items[]` holds only the top-level comments, so `items.length` and `pagination.page_size` count those alone; `data.comments_returned` counts every comment in the response, replies included, and is the number to compare with the post's comment count. Comment bodies are Reddit's own markdown source, so `comment.text` can contain markdown such as `**bold**` and `[label](url)`. Comment ids are unique within a response: cursor windows can re-offer a boundary node, and those are de-duplicated before the tree is returned. Very large threads are bounded, and `data.truncated` tells you whether more of the thread exists than the response carries. It is not simply a record of our own paging: a response that reached the source's end of the thread is still reported as `truncated: true` when it falls far short of the post's own comment count, because that end is the end of one ranking window rather than the end of the thread. So `truncated: true` can arrive with no `next_cursor`, which means the thread is incomplete and this endpoint cannot fetch you the rest. A whole thread pages from one top-level cursor, so `ext.replies_cursor` on an individual branch is rare. `truncated: false` means the response looks complete against the post's own count, which is normally still higher than the comments you receive because Reddit counts removed, deleted, and filtered replies that no listing returns to anyone. `items[]` can also contain a comment whose own parent was removed upstream: it sits at the top level beside the real roots, and `parent_id` is what separates them, because a root's `parent_id` equals its `post_id` and an orphan's does not. When the main source is unavailable, a backup answers with the same tree and fields, except that `author.avatar_url` is null.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_post_comments",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "advanced",
        "x-credit-cost": 5,
        "x-credit-cost-min": 5,
        "x-credit-cost-max": 9,
        "x-credit-cost-formula": "5 credits per page, with the default labels (sentiment, question, purchase_intent, complaint) included free. label=spam, toxic or low_quality holds 4 extra credits and refunds down to 1 credit per started 25 comments that were newly judged: comments already labelled are free, a page where nothing could be judged refunds the whole extra, and a cached page is free. With `max_pages`, `max_items` or `max_credits`, each page walked is billed at this price (a cached page is free), and `max_credits` caps the total.",
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Full URL of the Reddit post to fetch comments for",
            "schema": {
              "type": "string"
            },
            "example": "https://www.reddit.com/r/NoteTaking/comments/1o9s55r/i_tried_all_popular_ai_notetaking_apps_so_you/"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Cursor to get more comments, or replies.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "trim",
            "in": "query",
            "required": false,
            "description": "Accepted, but not honoured on this endpoint: the source that serves it does not offer a trimmed shape, so the response is the same either way. Kept because removing an accepted parameter would break existing calls.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "label",
            "in": "query",
            "required": false,
            "description": "Optional CSV of SocialCrawl labels to add to every comment: sentiment, spam, question, purchase_intent, complaint, toxic, low_quality, injection. Without this param every page already carries sentiment, question, purchase_intent and complaint, free; label= adds the labels you name to them (the defaults keep running). Each comment gains computed.labels with probabilities (0 to 1), so you choose the cut-off; a comment that could not be judged carries labels: null. sentiment, question, purchase_intent and complaint are free when asked for too; spam, toxic, low_quality and injection add 1 credit per started 25 newly judged comments (comments already labelled for anyone are free, and so is a cached page). injection flags text that addresses an AI system and tries to direct it (flagged, p); it never drops or rewrites a row. judgments=off (or label=none) turns the default labels off. data.labels reports what was judged and billed.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "exclude",
            "in": "query",
            "required": false,
            "description": "Optional CSV (spam, low_quality), only with the same preset in label. Drops comments whose probability is 0.8 or higher and lists their ids in data.labels.dropped_ids. A comment that could not be judged is never dropped.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "judgments",
            "in": "query",
            "required": false,
            "description": "Optional, on (the default) or off. By default every row gains free SocialCrawl judgments (computed.labels, and computed.relevance on search endpoints), reported in data.labels (mode default) and data.relevance (origin default), each with a status (complete, partial or skipped) and pending: the rows still being judged when the page was sent, which carry null now and are filled on your next call or cached read. Default judgments never add credits, never change an existing field, and never drop or reorder a row. off returns the page exactly as before, with none of those keys. label=none does the same.",
            "schema": {
              "type": "string",
              "enum": [
                "on",
                "off"
              ]
            }
          },
          {
            "name": "dry_run",
            "in": "query",
            "required": false,
            "description": "Optional. When 1, return a cost preview for this labelled or relevance-filtered request without fetching the page or judging any row. data.estimate reports rows_expected, rows_cached, label_credits_min, label_credits_max and base_credits. 0 credits charged.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            }
          },
          {
            "name": "label_evidence",
            "in": "query",
            "required": false,
            "description": "Optional, only with label=. When 1, every labelled row also carries computed.labels_evidence.<preset> = { quote, sentence_index }: the sentence in the row that most clearly shows the label, copied verbatim. Absent or null when no single sentence shows it.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            }
          },
          {
            "name": "fit",
            "in": "query",
            "required": false,
            "description": "Optional. When goal, keep the rows and fields needed for the goal you pass in goal= (plus any that are uncertain, and the first and last), and replace the rest with a stub. data.held_back lists the held ids and a recall id that re-reads the full page from cache at no extra charge. Without this param the page is unchanged.",
            "schema": {
              "type": "string",
              "enum": [
                "goal"
              ]
            }
          },
          {
            "name": "goal",
            "in": "query",
            "required": false,
            "description": "Required by fit=goal. What you are trying to do, in your own words, up to 300 characters.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "fit_tokens",
            "in": "query",
            "required": false,
            "description": "Optional, only with fit=goal. Soft cap on how much of the page to keep, in tokens. Uncertain blocks and the first and last block are kept even if they exceed it.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Only rows published on or after this date: YYYY-MM-DD (midnight UTC) or an ISO 8601 timestamp. Rows older than it are left off each page. This list is not in date order, so the walk does not stop at the date: keep following `next_cursor`, and each page costs what a page costs even when every row on it is filtered out. A row with no date is kept. `published_after`, `start_date`, `from_date`, `publish_time` (`yesterday`, `this-week`, `this-month`, `last-3-months`, `last-6-months`) and `max_age_days` are accepted and applied as `since`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "until",
            "in": "query",
            "required": false,
            "description": "Only rows published on or before this date: YYYY-MM-DD (that whole UTC day is included) or an ISO 8601 timestamp. Newer rows are left off each page and the walk does not stop, so older pages follow. A row with no date is kept. `published_before`, `end_date` and `to_date` are accepted and applied as `until`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_pages",
            "in": "query",
            "required": false,
            "description": "1 to 50 (default 1, or 50 when `max_items` or `max_credits` is sent). Walk up to this many pages in one call and return the rows from all of them. Each page walked is billed exactly as one call to this endpoint (a cached page is free) and counts against your rate limit; its charge and any refund are recorded under the page's own request id, listed in `data.walk.request_ids`. The walk stops early at the last page, or when the request's time budget runs low; `data.walk.stopped` says why (`end`, `max_pages`, `max_items`, `max_credits`, `time_budget`, `page_error`) and `pagination.next_cursor` continues from where it stopped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "max_items",
            "in": "query",
            "required": false,
            "description": "1 to 5000. Get more in one call: keep walking pages until the response holds at least this many rows, then stop with `data.walk.stopped: \"max_items\"`. The last page is returned whole (it was billed), so `data.items` can hold up to one page more than this, and `pagination.next_cursor` resumes right after it without skipping a row. Walks up to 50 pages unless `max_pages` says fewer; each page is billed as one call (a cached page is free). Add `max_credits` to cap the spend. A long walk can stop on the time budget first (`\"time_budget\"`): send the returned cursor with the same params to continue.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "max_credits",
            "in": "query",
            "required": false,
            "description": "1 to 100000. The most this call may spend, across every page it walks. A page starts only while the credits already spent plus that page's price (or, when higher, the most any page of this walk has cost) still fit, so the call never goes past it; the walk then stops with `data.walk.stopped: \"max_credits\"` and the cursor to resume. Sent alone, it walks as far as the budget goes (up to 50 pages). A value below the price of one page is a free 400 whose `error.details.page_credits` names that price. Credits a row join (`include=`) adds are known only once a page has run, so page 1 is checked against its own price.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/post/comments"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of canonical comment wrappers ({ comment })",
                          "items": {
                            "type": "object",
                            "description": "Canonical comment wrapper",
                            "properties": {
                              "comment": {
                                "type": "object",
                                "description": "Canonical Comment object (unified across all platforms)",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "Platform-specific comment ID (always a string)"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Direct URL to the comment on the source platform"
                                  },
                                  "parent_id": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Parent comment ID for nested replies, or null for top-level comments"
                                  },
                                  "post_id": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "ID of the post this comment belongs to"
                                  },
                                  "text": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Comment body. Tombstone sentinels ([deleted] / [removed]) are collapsed to null upstream: customers never see them."
                                  },
                                  "author": {
                                    "type": "object",
                                    "description": "Subset of Author fields for the comment author",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Comment author username (null when tombstoned)"
                                      },
                                      "display_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Comment author display name"
                                      },
                                      "avatar_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "URL to comment author profile picture"
                                      },
                                      "verified": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Whether the comment author is verified"
                                      }
                                    }
                                  },
                                  "engagement": {
                                    "type": "object",
                                    "description": "Engagement counts on the comment",
                                    "properties": {
                                      "likes": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Like / upvote count"
                                      },
                                      "replies": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Reply / child-comment count. `0` when the upstream structurally reports the count and the comment has no replies; `null` only when the upstream does not surface a reply count at all."
                                      }
                                    }
                                  },
                                  "flags": {
                                    "type": "object",
                                    "description": "Boolean flags on the comment",
                                    "properties": {
                                      "pinned": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Pinned flag (null when platform does not surface)"
                                      },
                                      "deleted": {
                                        "type": "boolean",
                                        "description": "Whether the comment is tombstoned (always present, even when false)"
                                      },
                                      "liked_by_creator": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "`/v1/instagram/post/comments` only: true when the post's creator liked (hearted) the comment, false when not, null when the source that served the call could not tell. Absent on every other endpoint."
                                      }
                                    }
                                  },
                                  "published_at": {
                                    "type": [
                                      "string",
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Comment creation timestamp as an ISO 8601 UTC string. When the upstream sent a Unix epoch it is converted here and the raw epoch is preserved under `comment.ext.published_at_epoch` for one deprecation cycle."
                                  },
                                  "ext": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Platform-specific passthrough tokens for reply expansion (present only on platforms that surface them)",
                                    "properties": {
                                      "replies_token": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "YouTube reply continuation token: pass to `/v1/youtube/video/comment/replies?continuationToken=`"
                                      },
                                      "replies_cursor": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Reddit reply-branch continuation cursor. Present when this comment's reply tree is truncated upstream: pass it back as `?cursor=` on `/v1/reddit/post/comments` to load the rest of the branch."
                                      },
                                      "depth": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Reddit comment nesting depth as the source reports it: 0 on a top-level comment, 1 on a direct reply, and so on. Present when the thread arrived flat and was re-nested into `replies[]`, so you can verify that nesting independently."
                                      },
                                      "published_at_epoch": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Raw Unix epoch for `published_at` (present only when the upstream sent a numeric epoch that was normalised to the ISO 8601 string)."
                                      },
                                      "feedback_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Facebook comment feedback id: feeds `/v1/facebook/post/comment/replies`"
                                      },
                                      "expansion_token": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Facebook comment expansion/paginator token: feeds `/v1/facebook/post/comment/replies`"
                                      },
                                      "author_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The commenter's platform-native numeric user id, where the upstream exposes one."
                                      },
                                      "ip_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.ip_location"
                                      },
                                      "urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.urn"
                                      },
                                      "reaction_counts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at comment.ext.reaction_counts",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at comment.ext.reaction_counts"
                                        }
                                      },
                                      "is_edited": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at comment.ext.is_edited"
                                      },
                                      "previous_replies_token": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.previous_replies_token"
                                      },
                                      "author_headline": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.author_headline"
                                      },
                                      "updated_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.updated_at"
                                      },
                                      "author_channel_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.author_channel_id"
                                      },
                                      "author_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.author_url"
                                      },
                                      "viewer_rating": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.viewer_rating"
                                      },
                                      "text_original": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.text_original"
                                      },
                                      "preview_replies": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at comment.ext.preview_replies",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at comment.ext.preview_replies"
                                        }
                                      },
                                      "lookup": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at comment.ext.lookup"
                                      },
                                      "post_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_title"
                                      },
                                      "post_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_url"
                                      },
                                      "subreddit": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.subreddit"
                                      },
                                      "subreddit_subscribers": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at comment.ext.subreddit_subscribers"
                                      },
                                      "post_score": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at comment.ext.post_score"
                                      },
                                      "post_comment_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at comment.ext.post_comment_count"
                                      },
                                      "post_author": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_author"
                                      },
                                      "post_published_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_published_at"
                                      },
                                      "post_flair": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_flair"
                                      },
                                      "is_submitter": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at comment.ext.is_submitter"
                                      },
                                      "edited_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.edited_at"
                                      },
                                      "controversiality": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at comment.ext.controversiality"
                                      },
                                      "content_language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "ISO 639-1 language tag for this comment, when the source reports one. X writes `zxx` / `und` for no linguistic content; those collapse to null."
                                      },
                                      "author_followers": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The commenter's follower count as embedded in this row. Snapshot as of whenever the replies source saw the account, not a live figure. On X this is present on every `tweet/replies` row."
                                      },
                                      "author_following": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The commenter's following count as embedded in this row. Same snapshot caveat as `author_followers`."
                                      },
                                      "author_posts_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The commenter's post count as embedded in this row. Same snapshot caveat as `author_followers`."
                                      },
                                      "author_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.author_location"
                                      },
                                      "quote_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "How many quote-posts this comment has, when the source reports it. On X a reply is a tweet, so this is the same figure `post.ext.quote_count` carries on tweet lanes."
                                      },
                                      "views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "View count for this comment, when the source reports it. On X a reply is a tweet and the count is public on posts from ~2022 onward."
                                      },
                                      "saves": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Bookmark / save count for this comment, when the source reports it. On X this is `legacy.bookmark_count`."
                                      }
                                    }
                                  },
                                  "replies": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Nested reply tree: array of child comments, each itself a full Comment object with its own `replies`. Populated on threaded platforms (Reddit); absent on flat-comment platforms, which thread only via `parent_id`.",
                                    "items": {
                                      "type": "object",
                                      "description": "Nested reply tree: array of child comments, each itself a full Comment object with its own `replies`. Populated on threaded platforms (Reddit); absent on flat-comment platforms, which thread only via `parent_id`."
                                    }
                                  }
                                }
                              }
                            }
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "truncated": {
                          "type": "boolean",
                          "description": "Whether the thread holds more comments than this response carries. `true` can arrive with `next_cursor: null`, which means the thread is incomplete and this endpoint cannot fetch you the rest: the source reached the end of one ranking window rather than the end of the thread. Do not infer this from `pagination.has_more`, which reports only whether a cursor exists. Absent means no completeness verdict was computed.",
                          "example": false
                        },
                        "comments_returned": {
                          "type": "integer",
                          "description": "How many comments this response carries, counting every nested reply. `items[]` holds only the top-level comments (each reply sits under its parent's `comment.replies[]`), so `items.length` and `pagination.page_size` count those alone. Compare this number, not `items.length`, with the post's comment count, which also counts removed and deleted replies that no listing returns.",
                          "example": 96
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "reddit",
                  "endpoint": "/v1/reddit/post/comments",
                  "data": {
                    "items": [
                      {
                        "comment": {
                          "id": "nk4bu00",
                          "url": "https://example.com/redacted",
                          "parent_id": "1o9s55r",
                          "post_id": "1o9s55r",
                          "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                          "author": {
                            "username": "user_0dc293",
                            "display_name": "user_d96928",
                            "avatar_url": "https://example.com/avatars/user_918b31.png",
                            "verified": null
                          },
                          "engagement": {
                            "likes": 7,
                            "replies": 1
                          },
                          "flags": {
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2025-10-18T10:27:59.144Z",
                          "ext": {
                            "depth": 0,
                            "published_at_epoch": 1760783279
                          },
                          "replies": [
                            {
                              "id": "nnbr72r",
                              "url": "https://example.com/redacted",
                              "parent_id": "nk4bu00",
                              "post_id": "1o9s55r",
                              "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                              "author": {
                                "username": "user_bec0fc",
                                "display_name": "user_47ef50",
                                "avatar_url": "https://example.com/avatars/user_63d5a5.png",
                                "verified": null
                              },
                              "engagement": {
                                "likes": 1,
                                "replies": null
                              },
                              "flags": {
                                "pinned": null,
                                "deleted": false
                              },
                              "published_at": "2025-11-05T23:14:00.172Z",
                              "ext": {
                                "depth": 1,
                                "published_at_epoch": 1762384440
                              }
                            }
                          ]
                        },
                        "computed": {
                          "language": "en",
                          "labels": {
                            "sentiment": {
                              "level": 3,
                              "score_0_1": 0.78,
                              "confidence": 0.91
                            },
                            "question": {
                              "p": 0.03
                            },
                            "purchase_intent": {
                              "p": 0.15
                            },
                            "complaint": {
                              "p": 0.03
                            }
                          }
                        }
                      },
                      {
                        "comment": {
                          "id": "nk4ee40",
                          "url": "https://example.com/redacted",
                          "parent_id": "1o9s55r",
                          "post_id": "1o9s55r",
                          "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                          "author": {
                            "username": "user_d43641",
                            "display_name": "user_5d003e",
                            "avatar_url": "https://example.com/avatars/user_bf53d9.png",
                            "verified": null
                          },
                          "engagement": {
                            "likes": 7,
                            "replies": null
                          },
                          "flags": {
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2025-10-18T10:52:23.370Z",
                          "ext": {
                            "depth": 0,
                            "published_at_epoch": 1760784743
                          }
                        },
                        "computed": {
                          "language": "en",
                          "labels": {
                            "sentiment": {
                              "level": 1,
                              "score_0_1": 0.24,
                              "confidence": 0.96
                            },
                            "question": {
                              "p": 0.03
                            },
                            "purchase_intent": {
                              "p": 0.03
                            },
                            "complaint": {
                              "p": 0.96
                            }
                          }
                        }
                      }
                    ],
                    "total": null,
                    "truncated": false,
                    "labels": {
                      "presets": [
                        "sentiment",
                        "question"
                      ],
                      "rows": 33,
                      "labelled": 33,
                      "cached": 33,
                      "skipped": 0,
                      "unjudged": 0,
                      "dropped": 0,
                      "dropped_ids": [],
                      "extra_credits": 0,
                      "methodology_version": "labels/1",
                      "mode": "default",
                      "status": "complete",
                      "pending": 0,
                      "pending_ids": []
                    },
                    "label_share": {
                      "policy_version": "share/1",
                      "presets": {
                        "question": {
                          "n": 33,
                          "counted": 5,
                          "abstained": 1,
                          "share": 0.1563,
                          "low": 0.0782,
                          "high": 0.2879,
                          "receipts": [
                            {
                              "id": "nk4qy74",
                              "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                            },
                            {
                              "id": "nk7zp1p",
                              "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                            }
                          ],
                          "policy_version": "share/1",
                          "too_few": false,
                          "at_cut": 5,
                          "nulls": 0,
                          "low_confidence": 1
                        },
                        "purchase_intent": {
                          "n": 33,
                          "counted": 2,
                          "abstained": 3,
                          "share": 0.0667,
                          "low": 0.0223,
                          "high": 0.1827,
                          "receipts": [
                            {
                              "id": "nk4fn67",
                              "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                            },
                            {
                              "id": "nlyjukn",
                              "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                            }
                          ],
                          "policy_version": "share/1",
                          "too_few": false,
                          "at_cut": 3,
                          "nulls": 0,
                          "low_confidence": 3
                        },
                        "complaint": {
                          "n": 33,
                          "counted": 3,
                          "abstained": 2,
                          "share": 0.0968,
                          "low": 0.0393,
                          "high": 0.2189,
                          "receipts": [
                            {
                              "id": "nk4ee40",
                              "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                            },
                            {
                              "id": "nlh1o80",
                              "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                            }
                          ],
                          "policy_version": "share/1",
                          "too_few": false,
                          "at_cut": 4,
                          "nulls": 0,
                          "low_confidence": 2
                        },
                        "sentiment": {
                          "positive": {
                            "n": 33,
                            "counted": 18,
                            "abstained": 5,
                            "share": null,
                            "low": 0.4875,
                            "high": 0.7731,
                            "receipts": [
                              {
                                "id": "nk4bu00",
                                "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                              },
                              {
                                "id": "nk4fn67",
                                "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                              }
                            ],
                            "policy_version": "share/1",
                            "too_few": true,
                            "at_cut": 18,
                            "nulls": 0,
                            "low_confidence": 5
                          },
                          "neutral": {
                            "n": 33,
                            "counted": 7,
                            "abstained": 5,
                            "share": null,
                            "low": 0.1416,
                            "high": 0.4024,
                            "receipts": [
                              {
                                "id": "nk4kecb",
                                "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                              },
                              {
                                "id": "nk4qy74",
                                "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                              }
                            ],
                            "policy_version": "share/1",
                            "too_few": true,
                            "at_cut": 7,
                            "nulls": 0,
                            "low_confidence": 5
                          },
                          "negative": {
                            "n": 33,
                            "counted": 3,
                            "abstained": 5,
                            "share": 0.1071,
                            "low": 0.0436,
                            "high": 0.2399,
                            "receipts": [
                              {
                                "id": "nk4ee40",
                                "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                              },
                              {
                                "id": "nk4exbw",
                                "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                              }
                            ],
                            "policy_version": "share/1",
                            "too_few": false,
                            "at_cut": 3,
                            "nulls": 0,
                            "low_confidence": 5
                          }
                        }
                      }
                    },
                    "comment_language": {
                      "policy_version": "share/1",
                      "n": 33,
                      "abstained": 1,
                      "judged_by": {
                        "script": 0,
                        "choice": 32
                      },
                      "shares": {
                        "en": {
                          "n": 33,
                          "counted": 32,
                          "abstained": 1,
                          "share": 1,
                          "low": 0.922,
                          "high": 1,
                          "receipts": [
                            {
                              "id": "nk4bu00",
                              "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                            },
                            {
                              "id": "nk4ee40",
                              "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted)."
                            }
                          ],
                          "policy_version": "share/1",
                          "too_few": false
                        }
                      }
                    },
                    "comment_recency": {
                      "policy_version": "d09-1",
                      "n": 33,
                      "counted": 33,
                      "abstained": 0,
                      "share_last_24h": 0,
                      "share_later_half": null,
                      "too_few": false,
                      "stage": "unknown",
                      "order": "default",
                      "recent_share_is_floor": true,
                      "receipts": []
                    },
                    "dropped": 0
                  },
                  "credits_used": 5,
                  "request_id": "req_example000000",
                  "cached": false,
                  "pagination": {
                    "next_cursor": null,
                    "has_more": false,
                    "page_size": 33
                  },
                  "credits_remaining": 9999,
                  "source": "captured",
                  "captured_at": "2026-10-02T15:39:22.882Z",
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/reddit/subreddit/search": {
      "get": {
        "summary": "Search within a subreddit",
        "description": "Searches for posts within a specific subreddit. Returns matching posts with titles, scores, comment counts, permalinks and, where the row carries them, the post body at `ext.selftext`, the author's avatar, structured media, the upvote ratio, the flair and Reddit's own content language. One result page is assembled from more than one index: the first rows are the community's own relevance ranking, unchanged and in its original order, and further rows are appended from Reddit's search index scoped to the same community. A page holds up to 25 posts and the exact count varies between calls, so read the length of `items` rather than assuming a number — pages of about 7 are what you get when only the first index answers. Because the page spans two indexes, three leaves are reported for only part of it and are `null` on the rest: `post.flags.spoiler`, `post.engagement.shares` and `post.engagement.saves`. A `null` there means the index that returned that row does not report the field, never that the value is false or zero, so do not aggregate over them. Omitting `query` returns the community listing from the first index alone, because Reddit's scoped search needs terms to match. `include_body=true` is still accepted and rarely needed now that bodies arrive on the rows themselves: it costs 1 extra credit per post that actually comes back with a body, up to 25 per page, and refunds every credit it does not spend. Ranking is a voice-of-customer sweep rather than precision retrieval, so expect some off-topic matches on short queries, and use quoted phrases to tighten them.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_subreddit_search",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 1,
        "x-credit-cost-min": 1,
        "x-credit-cost-max": 26,
        "x-credit-cost-formula": "1 credit for the search page. With include_body=true, 1 extra credit per post that comes back with a body, up to 25 per page, unused credits refunded. Link posts have no body and are not charged for. With `max_pages`, `max_items` or `max_credits`, each page walked is billed at this price (a cached page is free), and `max_credits` caps the total.",
        "parameters": [
          {
            "name": "subreddit",
            "in": "query",
            "required": true,
            "description": "Subreddit name (e.g. 'Fitness', not 'r/Fitness' or a full URL)",
            "schema": {
              "type": "string"
            },
            "example": "technology"
          },
          {
            "name": "query",
            "in": "query",
            "required": false,
            "description": "Search query to find matching content",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Sort order. For posts/media: relevance, hot, top, new, comments. For comments: relevance, top, new",
            "schema": {
              "type": "string",
              "enum": [
                "relevance",
                "hot",
                "top",
                "new",
                "comments"
              ]
            }
          },
          {
            "name": "timeframe",
            "in": "query",
            "required": false,
            "description": "Only return posts from this window. Applied on sort=relevance, sort=top and sort=comments. It has no effect with sort=new, which is already ordered newest-first and returns recent posts regardless.",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "year",
                "month",
                "week",
                "day",
                "hour"
              ]
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Cursor to get more results. Get 'cursor' from previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_body",
            "in": "query",
            "required": false,
            "description": "Set to true to include each post's body (selftext) on the search page. 1 extra credit per post that comes back with a body, unused credits refunded. Link posts have no body, so they are looked up and not charged for.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Only rows published on or after this date: YYYY-MM-DD (midnight UTC) or an ISO 8601 timestamp. Rows older than it are left off each page. This list is not in date order, so the walk does not stop at the date: keep following `next_cursor`, and each page costs what a page costs even when every row on it is filtered out. A row with no date is kept. `published_after`, `start_date`, `from_date`, `publish_time` (`yesterday`, `this-week`, `this-month`, `last-3-months`, `last-6-months`) and `max_age_days` are accepted and applied as `since`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "until",
            "in": "query",
            "required": false,
            "description": "Only rows published on or before this date: YYYY-MM-DD (that whole UTC day is included) or an ISO 8601 timestamp. Newer rows are left off each page and the walk does not stop, so older pages follow. A row with no date is kept. `published_before`, `end_date` and `to_date` are accepted and applied as `until`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_pages",
            "in": "query",
            "required": false,
            "description": "1 to 50 (default 1, or 50 when `max_items` or `max_credits` is sent). Walk up to this many pages in one call and return the rows from all of them. Each page walked is billed exactly as one call to this endpoint (a cached page is free) and counts against your rate limit; its charge and any refund are recorded under the page's own request id, listed in `data.walk.request_ids`. The walk stops early at the last page, or when the request's time budget runs low; `data.walk.stopped` says why (`end`, `max_pages`, `max_items`, `max_credits`, `time_budget`, `page_error`) and `pagination.next_cursor` continues from where it stopped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "max_items",
            "in": "query",
            "required": false,
            "description": "1 to 5000. Get more in one call: keep walking pages until the response holds at least this many rows, then stop with `data.walk.stopped: \"max_items\"`. The last page is returned whole (it was billed), so `data.items` can hold up to one page more than this, and `pagination.next_cursor` resumes right after it without skipping a row. Walks up to 50 pages unless `max_pages` says fewer; each page is billed as one call (a cached page is free). Add `max_credits` to cap the spend. A long walk can stop on the time budget first (`\"time_budget\"`): send the returned cursor with the same params to continue.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "max_credits",
            "in": "query",
            "required": false,
            "description": "1 to 100000. The most this call may spend, across every page it walks. A page starts only while the credits already spent plus that page's price (or, when higher, the most any page of this walk has cost) still fit, so the call never goes past it; the walk then stops with `data.walk.stopped: \"max_credits\"` and the cursor to resume. Sent alone, it walks as far as the budget goes (up to 50 pages). A value below the price of one page is a free 400 whose `error.details.page_credits` names that price. Credits a row join (`include=`) adds are known only once a page has run, so page 1 is checked against its own price.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/subreddit/search"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of canonical post wrappers ({ post, computed })",
                          "items": {
                            "type": "object",
                            "description": "Canonical post wrapper",
                            "properties": {
                              "post": {
                                "type": "object",
                                "description": "Canonical Post object (unified across all platforms)",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "Platform-specific post ID (always a string; numeric upstream IDs are stringified)"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Direct URL to the post on the source platform"
                                  },
                                  "content": {
                                    "type": "object",
                                    "description": "Post content fields (text, media, thumbnail, duration)",
                                    "properties": {
                                      "text": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Post caption, description, or text content"
                                      },
                                      "media_urls": {
                                        "type": [
                                          "string",
                                          "array",
                                          "null"
                                        ],
                                        "description": "URL(s) of the primary media. Single string for video/photo posts; array of strings for carousels.",
                                        "items": {
                                          "type": "string",
                                          "description": "URL(s) of the primary media. Single string for video/photo posts; array of strings for carousels."
                                        }
                                      },
                                      "thumbnail_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "URL to thumbnail image"
                                      },
                                      "duration_seconds": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Video/clip duration in seconds (null for non-video posts)"
                                      }
                                    }
                                  },
                                  "author": {
                                    "type": "object",
                                    "description": "Subset of Author fields for the post creator",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Author username"
                                      },
                                      "display_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Author display name"
                                      },
                                      "avatar_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "URL to author profile picture"
                                      },
                                      "verified": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Whether the author account is verified"
                                      }
                                    }
                                  },
                                  "engagement": {
                                    "type": "object",
                                    "description": "Engagement counts",
                                    "properties": {
                                      "views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "View count (if available). For Instagram video/reels this is the play count: the headline 'Views' the IG app shows. Instagram removed per-post play counts from its public web pages in August 2026, so `GET /v1/instagram/post` now fills the count automatically from a second source within the same call: videos and reels keep a numeric `views` with no extra endpoint or workaround. Note: since mid-July 2026 Instagram's play count is Instagram-only. It no longer includes Facebook crosspost views (Meta-side change; the app UI changed identically). For combined reach, also fetch the Facebook crosspost via `/v1/facebook/post`."
                                      },
                                      "likes": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Like / reaction count"
                                      },
                                      "comments": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Comment count. Note: on `GET /v1/instagram/post` this is Instagram's `edge_media_to_parent_comment.count` (top-level comments); the IG list endpoints report the mobile `comment_count` total (includes replies). Both land on this same field."
                                      },
                                      "shares": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Share / repost / retweet count. On Instagram this is `reshare_count` (the paper-plane Share / Send count) and it exists only on Instagram's mobile surface, so it is returned by `/v1/instagram/post/stats`, `/v1/instagram/profile/reels/full`, and `/v1/instagram/profile/posts/full`. The web-sourced Instagram list and search endpoints return `null` (never fabricated)."
                                      },
                                      "saves": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Save / bookmark count. `null` on Instagram: the save count is platform-private and Instagram exposes no numeric save metric on any surface (never fabricated)."
                                      }
                                    }
                                  },
                                  "flags": {
                                    "type": "object",
                                    "description": "Boolean flags on the post",
                                    "properties": {
                                      "nsfw": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "NSFW flag (null when platform does not surface)"
                                      },
                                      "spoiler": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Spoiler flag (null when platform does not surface)"
                                      },
                                      "pinned": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Pinned-to-profile flag (null when platform does not surface)"
                                      },
                                      "deleted": {
                                        "type": "boolean",
                                        "description": "Whether the post is tombstoned (always present)"
                                      },
                                      "likes_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Present and `true` when the creator has hidden the like count. `engagement.likes` is `null` in that case (never the platform's decoy preview number). Absent on normal posts."
                                      },
                                      "comments_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Present and `true` when the upstream reports the comment count as hidden. `engagement.comments` is `null` in that case. Absent on normal posts."
                                      },
                                      "shares_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.shares_hidden"
                                      },
                                      "views_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.views_hidden"
                                      },
                                      "saves_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.saves_hidden"
                                      }
                                    }
                                  },
                                  "published_at": {
                                    "type": [
                                      "string",
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Post creation timestamp as an ISO 8601 UTC string. When the upstream sent a Unix epoch it is converted here and the raw epoch is preserved under `post.ext.published_at_epoch` for one deprecation cycle."
                                  },
                                  "ext": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Platform-specific passthrough fields for cross-endpoint chains (present only on platforms that surface them)",
                                    "properties": {
                                      "music_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok music/clip id (exact string): pass to `/v1/tiktok/song/videos?clipId=` to find videos using the same sound"
                                      },
                                      "matched_song_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The catalogue song TikTok matched the video's sound to, as an exact digit string. An official clip and the original sounds creators upload with it have different `music_id` values and the same `matched_song_id`, so group rows on it to count every use of one song. It is not a clipId: `/v1/tiktok/song` and `/v1/tiktok/song/videos` do not accept it. `/v1/tiktok/search/music` carries it on each sound, so a search on the song's title and artist, kept to the sounds with the same `matched_song_id`, gives the song's official sounds and their `video_count`. Absent when TikTok matched the sound to no song, and on rows served from a source that does not report the match."
                                      },
                                      "matched_song_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The title of the song in `matched_song_id`. Absent when there is no matched song."
                                      },
                                      "matched_song_artist": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The artist of the song in `matched_song_id`, as TikTok's catalogue names it. Absent when there is no matched song."
                                      },
                                      "music_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The title of the video's own sound (`music_id`). An uploaded sound is titled like `original sound - <handle>`; the song it plays, when TikTok recognised one, is `matched_song_title`."
                                      },
                                      "music_artist": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The artist TikTok shows for the video's own sound. On an original sound this is the uploader's display name, not the song's artist; use `matched_song_artist` for that."
                                      },
                                      "music_is_original": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "TikTok only. `true` when the video's sound is an original sound a creator uploaded, `false` when it is a catalogue track. Absent when the source does not say."
                                      },
                                      "author_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The creator's platform-native numeric user id. On TikTok search and list items, pass to `/v1/tiktok/profile?user_id=` for the creator's current follower count (survives username changes). On Instagram `/v1/instagram/search/reels`, `/v1/instagram/search/hashtag` and `/v1/instagram/location/posts` items it is present on every row, accepted by `/v1/instagram/profile/country?user_id=` and `/v1/instagram/basic-profile?userId=`. On Facebook it appears when the upstream exposed a numeric actor id and no real handle."
                                      },
                                      "author_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The posting account's profile URL, so a matching post can be followed to its account. Present on `/v1/facebook/search/posts` rows: the vanity or `/people/<name>/<id>/` URL when Facebook sends one, otherwise `https://www.facebook.com/profile.php?id=<numeric id>` built from the account id. Pass it as `url` to `/v1/facebook/profile` (or to `/v1/prism/profiles` with `platform: facebook`). Null when the row names neither an account URL nor a numeric account id. Absent on other endpoints."
                                      },
                                      "author_followers": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The creator's follower count as embedded in the search payload itself, when the search source happens to carry one. On Instagram `search/reels` it is null on a plain call, because Instagram stopped sending follower counts in its search payload in August 2026; send `include=creator` (or `country`) and it is filled from the creator's profile, 2 credits per creator looked up. It stays null when that lookup does not resolve."
                                      },
                                      "author_following": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.author_following"
                                      },
                                      "author_posts_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.author_posts_count"
                                      },
                                      "author_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The free text the author wrote in their profile's location field, exactly as written (for example `Johannesburg, South Africa`). It is not a country code and is not checked. Present on X tweet and reply rows; null or absent when the author left it blank."
                                      },
                                      "in_reply_to_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.in_reply_to_id"
                                      },
                                      "in_reply_to_username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.in_reply_to_username"
                                      },
                                      "conversation_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.conversation_id"
                                      },
                                      "author_country": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The creator's country. On Instagram it is the country the creator declares on the About this account panel, as a country name (for example `Spain`), and it is not where the post was filmed. It is present on `/v1/instagram/search/reels` when the request sends `include=creator`, `include=country` or `country`, and on `/v1/instagram/search/hashtag` and `/v1/instagram/location/posts` when it sends `include=country`, filled by looking the creator up. On YouTube rows joined with `include=channel` it is the channel's own country as an ISO 3166-1 alpha-2 code (for example `ZA`). Null when the platform publishes no country for the creator or the lookup did not resolve, and nothing is guessed; absent on a plain call."
                                      },
                                      "author_public_email": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The public contact email on the creator's profile. Present only on `/v1/instagram/search/reels` when the request sends `include=creator`, filled by looking the creator up. Null when the creator lists no public email or the lookup did not resolve; absent on a plain call."
                                      },
                                      "author_public_phone": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The public contact phone number on the creator's profile. Present only on `/v1/instagram/search/reels` when the request sends `include=creator`, filled by looking the creator up. Null when the creator lists no public phone or the lookup did not resolve; absent on a plain call."
                                      },
                                      "download_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "How many times the video has been saved to a device. TikTok only, and distinct from `engagement.saves`: a save keeps the video in a private collection on the platform, a download takes a copy off it, and TikTok counts the two separately. Present on TikTok post, search and post-list responses; absent everywhere else."
                                      },
                                      "region": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only: the country TikTok registers the video to, as an ISO 3166-1 alpha-2 code (normally the creator's account country when they posted). It is not the viewer's country, not the `region` you requested, and not a language. On `/v1/tiktok/trending`, `/v1/tiktok/search`, `/v1/tiktok/search/top`, `/v1/tiktok/profile/videos`, `/v1/tiktok/search/hashtag` and `/v1/tiktok/song/videos` it is how you tell which rows are from a given country: filter on it when you need only that country. A row whose source omits the country stays null. The `region` request parameter still only sets the proxy."
                                      },
                                      "subreddit": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Reddit subreddit name (search/list items): pass to `/v1/reddit/subreddit/details?subreddit=`"
                                      },
                                      "title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.title"
                                      },
                                      "selftext": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.selftext"
                                      },
                                      "upvote_ratio": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Reddit only: the share of a post's votes that are upvotes, as a fraction from 0 to 1 and usually close to 1 (six live rows measured 1, 1, 1, 0.86, 0.75, 1). Fractional despite the integer type this schema emits for every numeric leaf, the same caveat as `author.ext.average_rating`. Populated on `/v1/reddit/search` rows whose source carries it, and null everywhere else on Reddit including `/v1/reddit/post` and `/v1/reddit/subreddit`."
                                      },
                                      "flair": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.flair"
                                      },
                                      "content_language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The language the platform itself tags the post with, when it sends one: Reddit's own language tag on Reddit lanes, and TikTok's caption-language tag (for example `de`) on `/v1/tiktok/trending?feed=local`. Null when the platform could not tell (Reddit `und`, TikTok `un`, common on short or emoji-only captions); absent where the source sends no tag. Never inferred from the text by us: that is `post.computed.language`."
                                      },
                                      "type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.type"
                                      },
                                      "content_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.content_type"
                                      },
                                      "ticker_symbols": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.ticker_symbols",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.ticker_symbols"
                                        }
                                      },
                                      "video_view_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram's legacy 3-second-view count. Historical: Instagram stopped serving it in August 2026 (removed from its web post surface along with the web play count), so fresh `/v1/instagram/post` lookups no longer carry it and no source can restore it. Use `engagement.views` (the play count) instead."
                                      },
                                      "ig_play_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram-only play count (`ig_play_count`). Since mid-July 2026 Instagram's headline play count (`engagement.views`) no longer includes Facebook crosspost views and equals this value; it is surfaced explicitly so you can tell the Instagram-only figure apart and detect any future re-divergence. For combined Instagram + Facebook reach, also fetch the Facebook crosspost via `/v1/facebook/post`. Present on `/v1/instagram/post/stats` and, since the August 2026 views fix, on `/v1/instagram/post` for video posts."
                                      },
                                      "repost_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.repost_count"
                                      },
                                      "media_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.media_type"
                                      },
                                      "text_truncated": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.text_truncated"
                                      },
                                      "ip_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.ip_location"
                                      },
                                      "carousel_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.carousel_count"
                                      },
                                      "remix_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.remix_count"
                                      },
                                      "audio_cluster_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Instagram's audio cluster for a reel, as an exact digit string: the id Instagram uses to group different uploads of the same sound. Present on `/v1/instagram/audio/reels` rows and on `/v1/instagram/profile/reels` with `include=stats`; absent on a row when it is not available and on every other surface."
                                      },
                                      "facebook_likes": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post share that was EXCLUDED from `engagement.likes` on this row. A post shared to Facebook arrives from some sources with its Facebook likes already folded into the Instagram count, so the share is subtracted and published here, which keeps `engagement.likes` the Instagram-only figure instagram.com shows on the post. Add the two together for the combined number. Absent when the read carried no Facebook share, and absent on a post whose owner hides the like count, because nothing can be subtracted from a null. A response that excluded a share also carries a note in `data._warnings`."
                                      },
                                      "facebook_comments": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post share that was EXCLUDED from `engagement.comments` on this row, the comment counterpart of `post.ext.facebook_likes`. Each leaf appears only for the count it actually changed, so a post whose likes are hidden but whose comments were reconciled carries this one alone."
                                      },
                                      "instagram_views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Instagram-only play count of a video, the same figure on every Instagram endpoint. `engagement.views` keeps each endpoint's established meaning: on `/v1/instagram/profile/reels`, `/v1/instagram/audio/reels`, `/v1/instagram/search/reels` and `/v1/instagram/search/hashtag` it can include the post's Facebook cross-post views, while on `/v1/instagram/post` and `/v1/instagram/post/stats` it is Instagram-only. Read this leaf when you compare one post across endpoints. Absent on photos and when the source did not report the Instagram-only figure."
                                      },
                                      "facebook_views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post part of a video's play count, the counterpart of `post.ext.instagram_views`. Present only when the source reported the Facebook part, or a combined total above the Instagram figure. Absent does not mean zero: some sources report the Instagram figure alone even for a cross-posted video."
                                      },
                                      "published_at_epoch": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Raw Unix epoch for `published_at` (seconds, or milliseconds when the upstream sent millis). Present only when the upstream sent a numeric epoch that was normalised to the ISO 8601 `published_at` string. Kept for one deprecation cycle for integrations pinned to the numeric form."
                                      },
                                      "usertags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.usertags",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.usertags"
                                        }
                                      },
                                      "coauthors": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram collaborative posts (the native \"Collab\" feature). The full list of co-author accounts on the post, as `{ id, username, full_name, is_verified, profile_pic_url }`. A collab post has ONE producer and appears in every co-author's grid, so `post.author` is whichever account created it, which is not necessarily the profile you queried. The complete set of accounts on a post is `post.author.username` plus every `username` in this array. An empty array means Instagram reports the post as NOT a collab; the field is absent on surfaces that carry no co-author signal, including `/v1/instagram/post` (its web source ships the field permanently empty, so use `/v1/instagram/post/stats` for a single post).",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram collaborative posts (the native \"Collab\" feature). The full list of co-author accounts on the post, as `{ id, username, full_name, is_verified, profile_pic_url }`. A collab post has ONE producer and appears in every co-author's grid, so `post.author` is whichever account created it, which is not necessarily the profile you queried. The complete set of accounts on a post is `post.author.username` plus every `username` in this array. An empty array means Instagram reports the post as NOT a collab; the field is absent on surfaces that carry no co-author signal, including `/v1/instagram/post` (its web source ships the field permanently empty, so use `/v1/instagram/post/stats` for a single post)."
                                        }
                                      },
                                      "music": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.music"
                                      },
                                      "sponsor_tags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram only: the brand accounts the post tags as its paid partner, as usernames (`[\"rolex\"]`). `[]` on a post with no partner tagged. Present on `/v1/instagram/post/stats`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram only: the brand accounts the post tags as its paid partner, as usernames (`[\"rolex\"]`). `[]` on a post with no partner tagged. Present on `/v1/instagram/post/stats`; absent on every other endpoint."
                                        }
                                      },
                                      "sponsored_disclosed": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "The platform's own disclosure that the post is paid or promotional: on Instagram the paid-partnership label (`is_paid_partnership`) or a tagged brand partner, on TikTok the label TikTok shows viewers (\"Paid partnership\", \"Commission paid\", \"Promotional content\"). `false` when the post carries the flag unset, null when it carries none. Present on `/v1/instagram/post/stats`, `/v1/instagram/search/reels` and `/v1/tiktok/search`; absent on every other endpoint."
                                      },
                                      "ai_label": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Instagram only: Instagram's AI-content label on the post, as the method Instagram reports: `classifier_score_high` (Instagram detected it, shown as \"Likely made with AI\"), `ai_created` or `ai_edited` (declared or detected as made or edited with AI). Null when the post carries no AI label. Present on `/v1/instagram/post/stats`; absent on every other endpoint."
                                      },
                                      "story_mentions": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: the accounts the story mentions with a mention sticker, as usernames in alphabetical order. `[]` when it mentions nobody. Present on `/v1/instagram/stories`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: the accounts the story mentions with a mention sticker, as usernames in alphabetical order. `[]` when it mentions nobody. Present on `/v1/instagram/stories`; absent on every other endpoint."
                                        }
                                      },
                                      "story_links": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: where the story's link stickers lead, as URLs in alphabetical order. Instagram wraps each link in its own redirect with a per-view click id; both are removed, so this is the destination itself. `[]` when the story has no link sticker. Present on `/v1/instagram/stories` and `/v1/instagram/highlight/detail`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: where the story's link stickers lead, as URLs in alphabetical order. Instagram wraps each link in its own redirect with a per-view click id; both are removed, so this is the destination itself. `[]` when the story has no link sticker. Present on `/v1/instagram/stories` and `/v1/instagram/highlight/detail`; absent on every other endpoint."
                                        }
                                      },
                                      "story_reshared_posts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: the feed posts the story reshares, as post URLs (`https://www.instagram.com/p/{shortcode}/`, which `/v1/instagram/post` takes). `[]` when it reshares none. Present on `/v1/instagram/stories`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: the feed posts the story reshares, as post URLs (`https://www.instagram.com/p/{shortcode}/`, which `/v1/instagram/post` takes). `[]` when it reshares none. Present on `/v1/instagram/stories`; absent on every other endpoint."
                                        }
                                      },
                                      "location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.location"
                                      },
                                      "media": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.media",
                                        "items": {
                                          "type": "object",
                                          "description": "Nested object: post.ext.media",
                                          "properties": {
                                            "type": {
                                              "type": "string",
                                              "description": "Leaf at post.ext.media.type"
                                            },
                                            "url": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.media.url"
                                            },
                                            "width": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.media.width"
                                            },
                                            "height": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.media.height"
                                            }
                                          }
                                        }
                                      },
                                      "top_comments": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.top_comments",
                                        "items": {
                                          "type": "object",
                                          "description": "Nested object: post.ext.top_comments",
                                          "properties": {
                                            "id": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.id"
                                            },
                                            "text": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.text"
                                            },
                                            "username": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.username"
                                            },
                                            "likes": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.top_comments.likes"
                                            },
                                            "published_at": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.published_at"
                                            }
                                          }
                                        }
                                      },
                                      "hashtags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.hashtags",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.hashtags"
                                        }
                                      },
                                      "mentions": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.mentions",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.mentions"
                                        }
                                      },
                                      "mentioned_user_ids": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.mentioned_user_ids",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.mentioned_user_ids"
                                        }
                                      },
                                      "quoted_post": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Threads quote posts: the post this one quotes, as `{ id, url, author: { id, username }, text, media_urls, thumbnail_url }`. A quote post usually carries no caption or media of its own, and the text and video you see on the post's page belong to this attachment, by a different author. It is returned here rather than merged into `post.content`, so `content.*` always stays the outer post's own content and one account's media is never attributed to another. Absent on posts that are not quote posts."
                                      },
                                      "retweeted_post": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.retweeted_post"
                                      },
                                      "quote_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.quote_count"
                                      },
                                      "all_media_urls": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.all_media_urls",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.all_media_urls"
                                        }
                                      },
                                      "reaction_counts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.reaction_counts",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.reaction_counts"
                                        }
                                      },
                                      "share_urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.share_urn"
                                      },
                                      "post_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.post_type"
                                      },
                                      "activity_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.activity_id"
                                      },
                                      "published_at_precision": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.published_at_precision"
                                      },
                                      "author_urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_urn"
                                      },
                                      "author_headline": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_headline"
                                      },
                                      "author_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_type"
                                      },
                                      "is_repost_quote": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.is_repost_quote"
                                      },
                                      "article": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.article"
                                      },
                                      "reaction_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.reaction_type"
                                      },
                                      "download_media_urls": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.download_media_urls",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.download_media_urls"
                                        }
                                      },
                                      "tags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.tags",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.tags"
                                        }
                                      },
                                      "categoryId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.categoryId"
                                      },
                                      "categoryTitle": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.categoryTitle"
                                      },
                                      "topicCategories": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.topicCategories",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.topicCategories"
                                        }
                                      },
                                      "duration": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.duration"
                                      },
                                      "license": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.license"
                                      },
                                      "madeForKids": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.madeForKids"
                                      },
                                      "defaultAudioLanguage": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.defaultAudioLanguage"
                                      },
                                      "hasPaidProductPlacement": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.hasPaidProductPlacement"
                                      },
                                      "caption": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.caption"
                                      },
                                      "position": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.position"
                                      },
                                      "playlistId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlistId"
                                      },
                                      "videoOwnerChannelId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.videoOwnerChannelId"
                                      },
                                      "videoPublishedAt": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.videoPublishedAt"
                                      },
                                      "description": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.description"
                                      },
                                      "default_language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.default_language"
                                      },
                                      "localizations": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.localizations"
                                      },
                                      "playlist_item_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_item_id"
                                      },
                                      "playlist_owner_channel_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_owner_channel_id"
                                      },
                                      "playlist_owner_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_owner_title"
                                      },
                                      "channel_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.channel_id"
                                      },
                                      "published_label": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.published_label"
                                      },
                                      "published_precision": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.published_precision"
                                      },
                                      "title_maybe_translated": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.title_maybe_translated"
                                      },
                                      "video_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.video_count"
                                      },
                                      "posts_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "`/v1/instagram/hashtag` only: the exact number of public posts Instagram counts under the hashtag. Live: it moves between calls minutes apart."
                                      },
                                      "commerce": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.commerce"
                                      },
                                      "on_screen_texts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.on_screen_texts",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.on_screen_texts"
                                        }
                                      },
                                      "topic_tag": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.topic_tag"
                                      },
                                      "reshare_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.reshare_count"
                                      },
                                      "dsp_ids": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.dsp_ids"
                                      },
                                      "topic_tag_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.topic_tag_id"
                                      },
                                      "amazon_shop_lists": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_lists",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_lists"
                                        }
                                      },
                                      "amazon_shop_trending_picks": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_trending_picks",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_trending_picks"
                                        }
                                      },
                                      "amazon_shop_curations": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_curations",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_curations"
                                        }
                                      },
                                      "amazon_shop_socials": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_socials",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.amazon_shop_socials"
                                        }
                                      },
                                      "ad": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Ad Library envelope (Facebook `adlibrary/ad` and `adlibrary/company/ads` items): page_id, currency, spend, reach_estimate, publisher_platforms, categories, targeted_or_reached_countries, cta_text, cta_type, link_url, is_active, end_date_iso, display_format, title, video_hd_url, video_sd_url. Absent on every non-ad surface."
                                      },
                                      "apple_music": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.apple_music"
                                      },
                                      "feedback_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.feedback_id"
                                      },
                                      "question_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN (`/v1/naver/kin/search`) only: the question's id (Naver's `docId`), read from the row's link. Kin returns one row per answer, so several rows can share it; send `group=question` for one row per question."
                                      },
                                      "answer_no": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN only: which answer of the question this row is (Naver's `answerNo`), read from the row's link."
                                      },
                                      "answer_nos": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN with `group=question` only: every answer number of the question that was on the page, best-ranked first.",
                                        "items": {
                                          "type": "integer",
                                          "description": "Naver KnowledgeiN with `group=question` only: every answer number of the question that was on the page, best-ranked first."
                                        }
                                      },
                                      "published_at_est": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN only: the question's date ESTIMATED from its id (`YYYY-MM-DD`, Korea time), never a published date, so `published_at` stays null. Absent for questions older than the calibration table."
                                      },
                                      "date_basis": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "How `post.ext.published_at_est` was derived. `kin_docid_estimate`: interpolated from the question id against question pages whose posted date was read."
                                      },
                                      "event": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.event"
                                      },
                                      "trend": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Trend-board envelope: what TikTok's own trend board says about the row. On `/v1/tiktok/hashtags/popular`: `rank`, `country_code`, `period_days`, `posts` and `views` for the window (not lifetime totals), `industry` / `industry_id` / `industry_label` for the first board the hashtag was read from (null for the overall board), `boards` listing EVERY board it ranks on as `{ industry, industry_id, industry_label, rank }` in board order (so a hashtag in the top 3 overall and on an industry board shows both), `popularity_curve` as `{ date, value }` with value 0 to 100 relative to the window's peak, and `top_creators`. On `/v1/tiktok/videos/popular`: `rank`, `country_code`, `period_days`, `order_by`, `period_views`, `organic_views`, `engagement_rate`, `six_second_view_through_rate`, `content_tags`. Absent on every non-board surface."
                                      },
                                      "updated_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.updated_at"
                                      },
                                      "alt_text": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.alt_text"
                                      },
                                      "board_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.board_name"
                                      }
                                    }
                                  }
                                }
                              },
                              "computed": {
                                "type": "object",
                                "description": "Server-computed analytics fields (consistent across platforms)",
                                "properties": {
                                  "engagement_rate": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Computed engagement rate (0..1). Null when the upstream lacks enough signal."
                                  },
                                  "language": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "ISO 639-1 language code detected from the post text. Null when undetectable."
                                  },
                                  "content_category": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Keyword-classified content category (e.g. tech, food, gaming). Null when undetectable."
                                  },
                                  "estimated_reach": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Estimated reach based on views or follower count. Null when uncomputable."
                                  },
                                  "save_rate": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Numeric at computed.save_rate"
                                  },
                                  "relevance": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Nested object: computed.relevance",
                                    "properties": {
                                      "p": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.p"
                                      },
                                      "sense": {
                                        "type": "string",
                                        "description": "Leaf at computed.relevance.sense"
                                      },
                                      "depth": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.depth"
                                      },
                                      "spam": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.spam"
                                      }
                                    }
                                  },
                                  "labels": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Leaf at computed.labels"
                                  },
                                  "labels_evidence": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Leaf at computed.labels_evidence"
                                  }
                                }
                              }
                            }
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "reddit",
                  "endpoint": "/v1/reddit/subreddit/search",
                  "data": {
                    "items": [
                      {
                        "post": {
                          "id": "1g42vo0",
                          "url": "https://www.reddit.com/r/technology/comments/1g42vo0/invisible_text_that_ai_chatbots_understand_and/",
                          "content": {
                            "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                            "media_urls": null,
                            "thumbnail_url": null,
                            "duration_seconds": null
                          },
                          "author": {
                            "username": null,
                            "display_name": null,
                            "avatar_url": null,
                            "verified": null
                          },
                          "engagement": {
                            "views": null,
                            "likes": 123,
                            "comments": 12,
                            "shares": null,
                            "saves": null
                          },
                          "flags": {
                            "nsfw": false,
                            "spoiler": false,
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2024-10-15T08:23:22.000Z",
                          "ext": {
                            "subreddit": "technology",
                            "title": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                            "selftext": null,
                            "upvote_ratio": null,
                            "flair": null,
                            "content_language": null,
                            "published_at_epoch": 1728980602
                          }
                        },
                        "computed": {
                          "engagement_rate": null,
                          "language": "en",
                          "content_category": "other",
                          "estimated_reach": null
                        }
                      },
                      {
                        "post": {
                          "id": "1phuhlh",
                          "url": "https://www.reddit.com/r/technology/comments/1phuhlh/what_happens_when_an_infinitemoney_machine/",
                          "content": {
                            "text": "Sample comment text (redacted).",
                            "media_urls": null,
                            "thumbnail_url": null,
                            "duration_seconds": null
                          },
                          "author": {
                            "username": "user_2391e3",
                            "display_name": "user_b7fc5f",
                            "avatar_url": null,
                            "verified": null
                          },
                          "engagement": {
                            "views": null,
                            "likes": 66,
                            "comments": 15,
                            "shares": null,
                            "saves": null
                          },
                          "flags": {
                            "nsfw": false,
                            "spoiler": false,
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2025-12-09T01:22:41.000Z",
                          "ext": {
                            "subreddit": "technology",
                            "title": "Sample comment text (redacted).",
                            "selftext": null,
                            "upvote_ratio": null,
                            "flair": null,
                            "content_language": null,
                            "published_at_epoch": 1765243361
                          }
                        },
                        "computed": {
                          "engagement_rate": null,
                          "language": "de",
                          "content_category": "other",
                          "estimated_reach": null
                        }
                      }
                    ],
                    "next_cursor": "sc2.eyJzIjoiYiIsImMiOiJleUpqWVc1a2FXUmhkR1Z6WDNKbGRIVnlibVZrSWpvaWUxd2ljMlZqZEdsdmJsOHhYM0JwY0dWc2FXNWxYekJmWjJ4dlltRnNYMjF2WkdsbWFXVnljMXdpT2x3aU1Wd2lMRndpYzJWamRHbHZibDh4WDNCcGNHVnNhVzVsWHpGZmJHOWpZV3hmYlc5a2FXWnBaWEp6WENJNlhDSXlYQ0lzWENKelpXTjBhVzl1WHpKZmNHbHdaV3hwYm1WZk4xOXpZMjl3WlY5emQybDBZMmhsY2x3aU9sd2lNRndpTEZ3aWMyVmpkR2x2Ymw4eVgzQnBjR1ZzYVc1bFh6aGZjRzl6ZEY5elpXRnlZMmhjSWpwY0lqZGNJaXhjSW5ObFkzUnBiMjVmTTE5d2FYQmxiR2x1WlY4d1gzTnBaR1ZpWVhKZlkyOXRiWFZ1YVhSNVgybHVabTljSWpwY0lqQmNJbjBpTENKbGVIQmxjbWxsYm1ObFgzTmxiR1ZqZEdsdmJpSTZJbkJ2YzNSZmQybDBhRjlqYjIxdGRXNXBkSGxmYzJsa1pXSmhjaUlzSW1WNGNHVnlhV1Z1WTJWZmRtVnljMmx2YmlJNkltUmxabUYxYkhRaUxDSnpaV04wYVc5dVh6SmZjR2x3Wld4cGJtVmZPRjl3YjNOMFgzTmxZWEpqYUNJNklqY2lmUT09In0",
                    "total": null,
                    "dropped": 0,
                    "_warnings": [
                      "This upstream surface returns titles without post bodies, so ext.selftext is null on every row here. /v1/reddit/search?query=subreddit:technology <your search terms> returns subreddit-scoped results WITH bodies for the same 1 credit, but it reads a different index: expect a different set of posts rather than this page with bodies added (measured, the two surfaces shared 10 of 42 rows across six subjects). The operator needs search terms beside it; on its own it errors. Use include_body=true on this endpoint only if you need this endpoint's sort and cursor: it costs 1 extra credit per hydrated post."
                    ]
                  },
                  "credits_used": 1,
                  "request_id": "req_example000000",
                  "cached": false,
                  "pagination": {
                    "next_cursor": "sc.eyJ2IjoyLCJjIjoic2MyLmV5SnpJam9pWWlJc0ltTWlPaUpsZVVwcVdWYzFhMkZYVW1oa1IxWjZXRE5LYkdSSVZubGliVlpyU1dwdmFXVXhkMmxqTWxacVpFZHNkbUpzT0hoWU0wSndZMGRXYzJGWE5XeFlla0ptV2pKNGRsbHRSbk5ZTWpGMldrZHNiV0ZYVm5sak1YZHBUMngzYVUxV2QybE1SbmRwWXpKV2FtUkhiSFppYkRoNFdETkNjR05IVm5OaFZ6VnNXSHBHWm1KSE9XcFpWM2htWWxjNWEyRlhXbkJhV0VwNldFTkpObGhEU1hsWVEwbHpXRU5LZWxwWFRqQmhWemwxV0hwS1ptTkhiSGRhVjNod1ltMVdaazR4T1hwWk1qbDNXbFk1ZW1ReWJEQlpNbWhzWTJ4M2FVOXNkMmxOUm5kcFRFWjNhV015Vm1wa1IyeDJZbXc0ZVZnelFuQmpSMVp6WVZjMWJGaDZhR1pqUnpsNlpFWTVlbHBYUm5sWk1taGpTV3B3WTBscVpHTkphWGhqU1c1T2JGa3pVbkJpTWpWbVRURTVkMkZZUW14aVIyeDFXbFk0ZDFnelRuQmFSMVpwV1ZoS1psa3lPWFJpV0ZaMVlWaFNOVmd5YkhWYWJUbGpTV3B3WTBscVFtTkpiakJwVEVOS2JHVklRbXhqYld4c1ltMU9iRmd6VG14aVIxWnFaRWRzZG1KcFNUWkpia0oyWXpOU1ptUXliREJoUmpscVlqSXhkR1JYTlhCa1NHeG1ZekpzYTFwWFNtaGphVWx6U1cxV05HTkhWbmxoVjFaMVdUSldabVJ0Vm5sak1teDJZbWxKTmtsdFVteGFiVVl4WWtoUmFVeERTbnBhVjA0d1lWYzVkVmg2U21aalIyeDNXbGQ0Y0dKdFZtWlBSamwzWWpOT01GZ3pUbXhaV0VwcVlVTkpOa2xxWTJsbVVUMDlJbjAiLCJlIjoicmVkZGl0L3N1YnJlZGRpdC9zZWFyY2giLCJwIjoiY3Vyc29yIn0",
                    "has_more": true,
                    "page_size": 7
                  },
                  "credits_remaining": 9999,
                  "source": "captured",
                  "captured_at": "2026-10-02T07:33:09.800Z",
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/reddit/profile": {
      "get": {
        "summary": "Get a Reddit user profile",
        "description": "Returns one Reddit account by username: the four-way karma split, the cake day, the bio, the avatar and banner, the trophy count and the profile title. `author.likes_count` is TOTAL karma; the split that Reddit users actually reason about is at `ext.post_karma`, `ext.comment_karma` and `ext.awardee_karma`, and the three sum to the total. `author.joined_at` is the cake day. `author.display_name` carries Reddit's `t2_` fullname, which is the same value and the same encoding this API puts on `post.author.display_name` and `comment.author.display_name`, so a profile joins to that account's posts and comments on one field. `author.url` is the canonical `https://www.reddit.com/user/<name>/` profile, derived from the username rather than fetched. `author.followers` is Reddit's public follower count for the account (`subscribers` on the upstream). It is a real number: accounts nobody follows report 0, and creator accounts report a non-zero count (measured 09/09/2026: u/GallowBoob 33899, u/spez 0, corroborated by a second independent source on the same day). Reddit publishes no following count and no submission count on this surface, so `author.following` and `author.posts_count` stay null. Verification, moderator and employee flags are not available on this surface and are null rather than guessed. When the main source is unavailable, a second source answers the same call with the same fields; only when both are down does the call return a 5xx, which costs nothing. A username that does not exist returns 404 and costs nothing. Usernames are matched case-insensitively.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_profile",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 1,
        "parameters": [
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Reddit username without the u/ prefix. Case-insensitive.",
            "schema": {
              "type": "string"
            },
            "example": "spez"
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/profile"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "Platform-specific user ID (always a string; platform-specific prefixes like `did:`, `spotify:artist:`, `t2_` are stripped)"
                        },
                        "username": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "User handle or username"
                        },
                        "display_name": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Display name or full name"
                        },
                        "avatar_url": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "URL to profile picture"
                        },
                        "bio": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Profile biography or description"
                        },
                        "verified": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Whether the account is verified"
                        },
                        "followers": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Follower or subscriber count as an integer. Exact on Instagram and on TikTok when the source exposes an unrounded figure. YouTube above 1,000 subscribers is YouTube's published three-significant-figure figure. When the integer is a published/rounded value, `author.ext.followers_approximate` is true."
                        },
                        "following": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Number of accounts followed"
                        },
                        "posts_count": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of posts / videos / tracks / episodes"
                        },
                        "likes_count": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total likes received across the author's content (when surfaced)"
                        },
                        "url": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Direct URL to the profile page"
                        },
                        "location": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "ISO region code (e.g. `US`) or freeform location string when surfaced"
                        },
                        "external_url": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Bio link / external website URL when surfaced by the platform"
                        },
                        "private": {
                          "type": [
                            "boolean",
                            "null"
                          ],
                          "description": "Boolean at author.private"
                        },
                        "joined_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "String at author.joined_at"
                        },
                        "last_post_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "String at author.last_post_at"
                        },
                        "ext": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "description": "Nested object: author.ext",
                          "properties": {
                            "social_context": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.social_context"
                            },
                            "account_created": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.account_created"
                            },
                            "country": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.country"
                            },
                            "country_name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.country_name"
                            },
                            "collects_received": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.collects_received"
                            },
                            "former_usernames": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.former_usernames",
                              "items": {
                                "type": "string",
                                "description": "String at author.ext.former_usernames"
                              }
                            },
                            "former_usernames_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Instagram profile/about: how many former usernames Instagram's \"About this account\" panel lists for the account. 0 when the panel lists none, null when the panel could not be read on this call (the response then carries a note saying so). A count above 0 means the handle was renamed at least once; the names themselves are not published."
                            },
                            "verified_at": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Instagram profile/about, opt-in (`include=verified_at`): the month Instagram verified the account, as the panel shows it (\"April 2024\"). A month, not a date. Null when the account is not verified or the panel shows no verification date. Absent unless requested."
                            },
                            "public_email": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.public_email"
                            },
                            "contact_email": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Opt-in (`contact_email=1` on instagram/profile, youtube/channel and youtube/channel/about). When the bio lists two or more email addresses, the one the creator gives for contacting them personally, copied verbatim. Null when there is one address or none, when every address belongs to a manager, agency or brand, or when the choice was not confident. `author.ext.public_email` (the first address in the bio) is unchanged."
                            },
                            "public_phone": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.public_phone"
                            },
                            "similar_source": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.similar_source"
                            },
                            "instagram_username": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.instagram_username"
                            },
                            "similar_via": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.similar_via"
                            },
                            "business_category": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.business_category"
                            },
                            "bio_links": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.bio_links",
                              "items": {
                                "type": "object",
                                "description": "Nested object: author.ext.bio_links",
                                "properties": {
                                  "title": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at author.ext.bio_links.title"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at author.ext.bio_links.url"
                                  },
                                  "link_type": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at author.ext.bio_links.link_type"
                                  }
                                }
                              }
                            },
                            "is_business": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_business"
                            },
                            "is_professional": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_professional"
                            },
                            "creator_marketplace": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.creator_marketplace"
                            },
                            "verification_label": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.verification_label"
                            },
                            "fbid": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.fbid"
                            },
                            "hd_avatar_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.hd_avatar_url"
                            },
                            "website": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.website"
                            },
                            "cover_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.cover_url"
                            },
                            "page_active": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.page_active"
                            },
                            "employee_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.employee_count"
                            },
                            "employee_count_range": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "description": "Nested object: author.ext.employee_count_range",
                              "properties": {
                                "start": {
                                  "type": [
                                    "integer",
                                    "null"
                                  ],
                                  "description": "Numeric at author.ext.employee_count_range.start"
                                },
                                "end": {
                                  "type": [
                                    "integer",
                                    "null"
                                  ],
                                  "description": "Numeric at author.ext.employee_count_range.end"
                                }
                              }
                            },
                            "founded_year": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.founded_year"
                            },
                            "company_type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.company_type"
                            },
                            "tagline": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.tagline"
                            },
                            "specialities": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.specialities",
                              "items": {
                                "type": "string",
                                "description": "String at author.ext.specialities"
                              }
                            },
                            "industries": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.industries",
                              "items": {
                                "type": "string",
                                "description": "String at author.ext.industries"
                              }
                            },
                            "headquarters": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at author.ext.headquarters"
                            },
                            "locations": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.locations",
                              "items": {
                                "type": "string",
                                "description": "Leaf at author.ext.locations"
                              }
                            },
                            "hashtags": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.hashtags",
                              "items": {
                                "type": "string",
                                "description": "Leaf at author.ext.hashtags"
                              }
                            },
                            "funding": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at author.ext.funding"
                            },
                            "address": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.address"
                            },
                            "price_range": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.price_range"
                            },
                            "rating": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.rating"
                            },
                            "rating_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.rating_count"
                            },
                            "talking_about_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.talking_about_count"
                            },
                            "business_hours": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.business_hours",
                              "items": {
                                "type": "string",
                                "description": "Leaf at author.ext.business_hours"
                              }
                            },
                            "links": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.links",
                              "items": {
                                "type": "string",
                                "description": "Leaf at author.ext.links"
                              }
                            },
                            "ad_library_page_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.ad_library_page_id"
                            },
                            "ad_library_status": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.ad_library_status"
                            },
                            "urn": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.urn"
                            },
                            "is_top_voice": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_top_voice"
                            },
                            "is_premium": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_premium"
                            },
                            "is_creator": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_creator"
                            },
                            "is_influencer": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_influencer"
                            },
                            "is_open_to_work": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_open_to_work"
                            },
                            "is_hiring": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_hiring"
                            },
                            "member_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.member_id"
                            },
                            "company_id": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.company_id"
                            },
                            "reaction_type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.reaction_type"
                            },
                            "followers_approximate": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "True when `author.followers` is a published or rounded figure rather than an unrounded census: LinkedIn people-list display buckets, TikTok `stats.followerCount` when the exact sibling is absent, and YouTube subscriber counts at or above 1,000. Null or absent on exact counts."
                            },
                            "counts_source": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "TikTok profile only. Which of TikTok's two live counter sets `author.followers`, `author.following`, `author.likes_count` and `author.posts_count` carry: `app` (TikTok's app counters, the default) or `web` (the website's `statsV2`, returned with `counts=web`). The two sets can differ by a few percent in either direction."
                            },
                            "keywords": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.keywords"
                            },
                            "total_views": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.total_views"
                            },
                            "joined_at_timestamp": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.joined_at_timestamp"
                            },
                            "topicCategories": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.topicCategories",
                              "items": {
                                "type": "string",
                                "description": "String at author.ext.topicCategories"
                              }
                            },
                            "bannerExternalUrl": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.bannerExternalUrl"
                            },
                            "madeForKids": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.madeForKids"
                            },
                            "hiddenSubscriberCount": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.hiddenSubscriberCount"
                            },
                            "related_playlists": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at author.ext.related_playlists"
                            },
                            "topic_ids": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.topic_ids",
                              "items": {
                                "type": "string",
                                "description": "String at author.ext.topic_ids"
                              }
                            },
                            "unsubscribed_trailer": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.unsubscribed_trailer"
                            },
                            "localizations": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at author.ext.localizations"
                            },
                            "monthly_listeners": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.monthly_listeners"
                            },
                            "total_ratings": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Spotify podcasts only: how many listeners have rated the show. Cumulative over the show's whole run, so it reflects longevity as well as size, and it is NOT an audience count (Spotify publishes no play, download, subscriber or follower count for a podcast)"
                            },
                            "average_rating": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Spotify podcasts only: mean listener rating from 0 to 5. Fractional (e.g. 4.66) despite the integer type this schema emits for every numeric leaf"
                            },
                            "creator_username": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.creator_username"
                            },
                            "join_policy": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.join_policy"
                            },
                            "is_nsfw": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.is_nsfw"
                            },
                            "rules": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.rules",
                              "items": {
                                "type": "string",
                                "description": "Leaf at author.ext.rules"
                              }
                            },
                            "weekly_active_users": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.weekly_active_users"
                            },
                            "weekly_contributions": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.weekly_contributions"
                            },
                            "rules_text": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.rules_text"
                            },
                            "language": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.language"
                            },
                            "post_karma": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.post_karma"
                            },
                            "comment_karma": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.comment_karma"
                            },
                            "awardee_karma": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.awardee_karma"
                            },
                            "trophy_count": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.trophy_count"
                            },
                            "banner_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.banner_url"
                            },
                            "profile_title": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.profile_title"
                            },
                            "social_links": {
                              "type": [
                                "array",
                                "null"
                              ],
                              "description": "Array at author.ext.social_links",
                              "items": {
                                "type": "string",
                                "description": "Leaf at author.ext.social_links"
                              }
                            },
                            "bio_link": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.bio_link"
                            },
                            "embed_html": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.embed_html"
                            },
                            "embed_url": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.embed_url"
                            },
                            "group": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Leaf at author.ext.group"
                            },
                            "search_hit": {
                              "type": [
                                "object",
                                "null"
                              ],
                              "description": "Nested object: author.ext.search_hit",
                              "properties": {
                                "match": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "Leaf at author.ext.search_hit.match"
                                },
                                "title": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at author.ext.search_hit.title"
                                },
                                "snippet": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at author.ext.search_hit.snippet"
                                },
                                "evidence_url": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "String at author.ext.search_hit.evidence_url"
                                },
                                "matched_urls": {
                                  "type": [
                                    "array",
                                    "null"
                                  ],
                                  "description": "Array at author.ext.search_hit.matched_urls",
                                  "items": {
                                    "type": "string",
                                    "description": "String at author.ext.search_hit.matched_urls"
                                  }
                                }
                              }
                            },
                            "blog_name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.blog_name"
                            },
                            "blog_no": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.blog_no"
                            },
                            "visitors_today": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.visitors_today"
                            },
                            "visitors_total": {
                              "type": [
                                "integer",
                                "null"
                              ],
                              "description": "Numeric at author.ext.visitors_total"
                            },
                            "topic": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "String at author.ext.topic"
                            },
                            "power_blog": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.power_blog"
                            },
                            "official_blog": {
                              "type": [
                                "boolean",
                                "null"
                              ],
                              "description": "Boolean at author.ext.official_blog"
                            }
                          }
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      }
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "reddit",
                  "endpoint": "/v1/reddit/profile",
                  "data": {
                    "author": {
                      "id": "spez",
                      "username": "spez",
                      "display_name": "t2_1w72",
                      "avatar_url": "https://styles.redditmedia.com/t5_3k30p/styles/profileIcon_uj015iwx9s7g1.png?width=64&height=64&frame=1&auto=webp&crop=64:64,smart&s=0af32bd27feadee648af9434f5d8ffa782225a45",
                      "bio": "Reddit CEO",
                      "verified": null,
                      "followers": 0,
                      "following": null,
                      "posts_count": null,
                      "likes_count": 941001,
                      "url": "https://www.reddit.com/user/spez/",
                      "private": null,
                      "joined_at": "2005-06-06T04:00:00.000000+0000",
                      "ext": {
                        "is_nsfw": false,
                        "post_karma": 184508,
                        "comment_karma": 756493,
                        "awardee_karma": 0,
                        "trophy_count": 52,
                        "banner_url": "",
                        "profile_title": "spez",
                        "social_links": null
                      }
                    },
                    "computed": {
                      "engagement_rate": null,
                      "language": null,
                      "content_category": "other",
                      "estimated_reach": null
                    }
                  },
                  "credits_used": 1,
                  "request_id": "req_example000000",
                  "cached": false,
                  "credits_remaining": 9999,
                  "source": "captured",
                  "captured_at": "2026-10-02T15:39:24.220Z",
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/reddit/profile/posts": {
      "get": {
        "summary": "List a Reddit user's posts",
        "description": "Returns the posts a Reddit account has submitted, newest first by default, up to 25 per page. Each row carries the title, the body at `ext.selftext`, the score, the comment count, the upvote ratio, the flair, Reddit's own content language, the author avatar, structured media at `content.media_urls` and the permalink. `ext.subreddit` is the field that matters most on this lane and is populated on every row: a person's submissions span communities by construction, so it is the only thing that says where each post landed. Paginate with `cursor` from the previous response's `pagination.next_cursor`. `post.engagement.shares` is null here, as on every Reddit list endpoint — the upstream sends a share-BUTTON count on this shape and that is a different metric from the crosspost count this field means, so it is not published. An account with no submissions returns an empty list and is refunded; an account that does not exist is indistinguishable from one with no posts on this upstream and returns the same empty list, so check `/v1/reddit/profile` when you need to tell them apart. When the main source is unavailable, the first page in the default order is answered by a second source: the same posts, with `author.avatar_url` and `ext.content_language` null and no next cursor. A later page, `sort=hot`, `sort=top` or a `timeframe` has no second source and returns an error to retry.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_profile_posts",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 1,
        "parameters": [
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Reddit username without the u/ prefix. Case-insensitive.",
            "schema": {
              "type": "string"
            },
            "example": "spez"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Sort order for the account's submissions. `top` defaults to the all-time window; pass `timeframe` to narrow it.",
            "schema": {
              "type": "string",
              "enum": [
                "hot",
                "new",
                "top"
              ]
            }
          },
          {
            "name": "timeframe",
            "in": "query",
            "required": false,
            "description": "Only return posts from this window. Applied on `sort=top`. Omitted `sort=top` is treated as `timeframe=all` so the documented call is not an empty page.",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "year",
                "month",
                "week",
                "day",
                "hour"
              ]
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Cursor to get more results. Get 'cursor' from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Only rows published on or after this date: YYYY-MM-DD (midnight UTC) or an ISO 8601 timestamp. Rows older than it are left off the page, and the page that reaches one ends the walk: `next_cursor` is not returned and `pagination.stopped_at` is `since`. Sending it sets the newest-first sort shown in this endpoint's sort parameter (any other sort value is a free 400). The page still costs what a page costs, so you pay for the pages you walk and no more. A row with no date is kept. `published_after`, `start_date`, `from_date`, `publish_time` (`yesterday`, `this-week`, `this-month`, `last-3-months`, `last-6-months`) and `max_age_days` are accepted and applied as `since`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "until",
            "in": "query",
            "required": false,
            "description": "Only rows published on or before this date: YYYY-MM-DD (that whole UTC day is included) or an ISO 8601 timestamp. Newer rows are left off each page and the walk does not stop, so older pages follow. A row with no date is kept. `published_before`, `end_date` and `to_date` are accepted and applied as `until`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_pages",
            "in": "query",
            "required": false,
            "description": "1 to 50 (default 1, or 50 when `max_items` or `max_credits` is sent). Walk up to this many pages in one call and return the rows from all of them. Each page walked is billed exactly as one call to this endpoint (a cached page is free) and counts against your rate limit; its charge and any refund are recorded under the page's own request id, listed in `data.walk.request_ids`. The walk stops early at the last page, or when the request's time budget runs low; `data.walk.stopped` says why (`end`, `max_pages`, `max_items`, `max_credits`, `time_budget`, `page_error`) and `pagination.next_cursor` continues from where it stopped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "max_items",
            "in": "query",
            "required": false,
            "description": "1 to 5000. Get more in one call: keep walking pages until the response holds at least this many rows, then stop with `data.walk.stopped: \"max_items\"`. The last page is returned whole (it was billed), so `data.items` can hold up to one page more than this, and `pagination.next_cursor` resumes right after it without skipping a row. Walks up to 50 pages unless `max_pages` says fewer; each page is billed as one call (a cached page is free). Add `max_credits` to cap the spend. A long walk can stop on the time budget first (`\"time_budget\"`): send the returned cursor with the same params to continue.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "max_credits",
            "in": "query",
            "required": false,
            "description": "1 to 100000. The most this call may spend, across every page it walks. A page starts only while the credits already spent plus that page's price (or, when higher, the most any page of this walk has cost) still fit, so the call never goes past it; the walk then stops with `data.walk.stopped: \"max_credits\"` and the cursor to resume. Sent alone, it walks as far as the budget goes (up to 50 pages). A value below the price of one page is a free 400 whose `error.details.page_credits` names that price. Credits a row join (`include=`) adds are known only once a page has run, so page 1 is checked against its own price.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/profile/posts"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of canonical post wrappers ({ post, computed })",
                          "items": {
                            "type": "object",
                            "description": "Canonical post wrapper",
                            "properties": {
                              "post": {
                                "type": "object",
                                "description": "Canonical Post object (unified across all platforms)",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "Platform-specific post ID (always a string; numeric upstream IDs are stringified)"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Direct URL to the post on the source platform"
                                  },
                                  "content": {
                                    "type": "object",
                                    "description": "Post content fields (text, media, thumbnail, duration)",
                                    "properties": {
                                      "text": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Post caption, description, or text content"
                                      },
                                      "media_urls": {
                                        "type": [
                                          "string",
                                          "array",
                                          "null"
                                        ],
                                        "description": "URL(s) of the primary media. Single string for video/photo posts; array of strings for carousels.",
                                        "items": {
                                          "type": "string",
                                          "description": "URL(s) of the primary media. Single string for video/photo posts; array of strings for carousels."
                                        }
                                      },
                                      "thumbnail_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "URL to thumbnail image"
                                      },
                                      "duration_seconds": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Video/clip duration in seconds (null for non-video posts)"
                                      }
                                    }
                                  },
                                  "author": {
                                    "type": "object",
                                    "description": "Subset of Author fields for the post creator",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Author username"
                                      },
                                      "display_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Author display name"
                                      },
                                      "avatar_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "URL to author profile picture"
                                      },
                                      "verified": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Whether the author account is verified"
                                      }
                                    }
                                  },
                                  "engagement": {
                                    "type": "object",
                                    "description": "Engagement counts",
                                    "properties": {
                                      "views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "View count (if available). For Instagram video/reels this is the play count: the headline 'Views' the IG app shows. Instagram removed per-post play counts from its public web pages in August 2026, so `GET /v1/instagram/post` now fills the count automatically from a second source within the same call: videos and reels keep a numeric `views` with no extra endpoint or workaround. Note: since mid-July 2026 Instagram's play count is Instagram-only. It no longer includes Facebook crosspost views (Meta-side change; the app UI changed identically). For combined reach, also fetch the Facebook crosspost via `/v1/facebook/post`."
                                      },
                                      "likes": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Like / reaction count"
                                      },
                                      "comments": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Comment count. Note: on `GET /v1/instagram/post` this is Instagram's `edge_media_to_parent_comment.count` (top-level comments); the IG list endpoints report the mobile `comment_count` total (includes replies). Both land on this same field."
                                      },
                                      "shares": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Share / repost / retweet count. On Instagram this is `reshare_count` (the paper-plane Share / Send count) and it exists only on Instagram's mobile surface, so it is returned by `/v1/instagram/post/stats`, `/v1/instagram/profile/reels/full`, and `/v1/instagram/profile/posts/full`. The web-sourced Instagram list and search endpoints return `null` (never fabricated)."
                                      },
                                      "saves": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Save / bookmark count. `null` on Instagram: the save count is platform-private and Instagram exposes no numeric save metric on any surface (never fabricated)."
                                      }
                                    }
                                  },
                                  "flags": {
                                    "type": "object",
                                    "description": "Boolean flags on the post",
                                    "properties": {
                                      "nsfw": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "NSFW flag (null when platform does not surface)"
                                      },
                                      "spoiler": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Spoiler flag (null when platform does not surface)"
                                      },
                                      "pinned": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Pinned-to-profile flag (null when platform does not surface)"
                                      },
                                      "deleted": {
                                        "type": "boolean",
                                        "description": "Whether the post is tombstoned (always present)"
                                      },
                                      "likes_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Present and `true` when the creator has hidden the like count. `engagement.likes` is `null` in that case (never the platform's decoy preview number). Absent on normal posts."
                                      },
                                      "comments_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Present and `true` when the upstream reports the comment count as hidden. `engagement.comments` is `null` in that case. Absent on normal posts."
                                      },
                                      "shares_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.shares_hidden"
                                      },
                                      "views_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.views_hidden"
                                      },
                                      "saves_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.saves_hidden"
                                      }
                                    }
                                  },
                                  "published_at": {
                                    "type": [
                                      "string",
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Post creation timestamp as an ISO 8601 UTC string. When the upstream sent a Unix epoch it is converted here and the raw epoch is preserved under `post.ext.published_at_epoch` for one deprecation cycle."
                                  },
                                  "ext": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Platform-specific passthrough fields for cross-endpoint chains (present only on platforms that surface them)",
                                    "properties": {
                                      "music_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok music/clip id (exact string): pass to `/v1/tiktok/song/videos?clipId=` to find videos using the same sound"
                                      },
                                      "matched_song_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The catalogue song TikTok matched the video's sound to, as an exact digit string. An official clip and the original sounds creators upload with it have different `music_id` values and the same `matched_song_id`, so group rows on it to count every use of one song. It is not a clipId: `/v1/tiktok/song` and `/v1/tiktok/song/videos` do not accept it. `/v1/tiktok/search/music` carries it on each sound, so a search on the song's title and artist, kept to the sounds with the same `matched_song_id`, gives the song's official sounds and their `video_count`. Absent when TikTok matched the sound to no song, and on rows served from a source that does not report the match."
                                      },
                                      "matched_song_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The title of the song in `matched_song_id`. Absent when there is no matched song."
                                      },
                                      "matched_song_artist": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The artist of the song in `matched_song_id`, as TikTok's catalogue names it. Absent when there is no matched song."
                                      },
                                      "music_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The title of the video's own sound (`music_id`). An uploaded sound is titled like `original sound - <handle>`; the song it plays, when TikTok recognised one, is `matched_song_title`."
                                      },
                                      "music_artist": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The artist TikTok shows for the video's own sound. On an original sound this is the uploader's display name, not the song's artist; use `matched_song_artist` for that."
                                      },
                                      "music_is_original": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "TikTok only. `true` when the video's sound is an original sound a creator uploaded, `false` when it is a catalogue track. Absent when the source does not say."
                                      },
                                      "author_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The creator's platform-native numeric user id. On TikTok search and list items, pass to `/v1/tiktok/profile?user_id=` for the creator's current follower count (survives username changes). On Instagram `/v1/instagram/search/reels`, `/v1/instagram/search/hashtag` and `/v1/instagram/location/posts` items it is present on every row, accepted by `/v1/instagram/profile/country?user_id=` and `/v1/instagram/basic-profile?userId=`. On Facebook it appears when the upstream exposed a numeric actor id and no real handle."
                                      },
                                      "author_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The posting account's profile URL, so a matching post can be followed to its account. Present on `/v1/facebook/search/posts` rows: the vanity or `/people/<name>/<id>/` URL when Facebook sends one, otherwise `https://www.facebook.com/profile.php?id=<numeric id>` built from the account id. Pass it as `url` to `/v1/facebook/profile` (or to `/v1/prism/profiles` with `platform: facebook`). Null when the row names neither an account URL nor a numeric account id. Absent on other endpoints."
                                      },
                                      "author_followers": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The creator's follower count as embedded in the search payload itself, when the search source happens to carry one. On Instagram `search/reels` it is null on a plain call, because Instagram stopped sending follower counts in its search payload in August 2026; send `include=creator` (or `country`) and it is filled from the creator's profile, 2 credits per creator looked up. It stays null when that lookup does not resolve."
                                      },
                                      "author_following": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.author_following"
                                      },
                                      "author_posts_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.author_posts_count"
                                      },
                                      "author_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The free text the author wrote in their profile's location field, exactly as written (for example `Johannesburg, South Africa`). It is not a country code and is not checked. Present on X tweet and reply rows; null or absent when the author left it blank."
                                      },
                                      "in_reply_to_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.in_reply_to_id"
                                      },
                                      "in_reply_to_username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.in_reply_to_username"
                                      },
                                      "conversation_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.conversation_id"
                                      },
                                      "author_country": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The creator's country. On Instagram it is the country the creator declares on the About this account panel, as a country name (for example `Spain`), and it is not where the post was filmed. It is present on `/v1/instagram/search/reels` when the request sends `include=creator`, `include=country` or `country`, and on `/v1/instagram/search/hashtag` and `/v1/instagram/location/posts` when it sends `include=country`, filled by looking the creator up. On YouTube rows joined with `include=channel` it is the channel's own country as an ISO 3166-1 alpha-2 code (for example `ZA`). Null when the platform publishes no country for the creator or the lookup did not resolve, and nothing is guessed; absent on a plain call."
                                      },
                                      "author_public_email": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The public contact email on the creator's profile. Present only on `/v1/instagram/search/reels` when the request sends `include=creator`, filled by looking the creator up. Null when the creator lists no public email or the lookup did not resolve; absent on a plain call."
                                      },
                                      "author_public_phone": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The public contact phone number on the creator's profile. Present only on `/v1/instagram/search/reels` when the request sends `include=creator`, filled by looking the creator up. Null when the creator lists no public phone or the lookup did not resolve; absent on a plain call."
                                      },
                                      "download_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "How many times the video has been saved to a device. TikTok only, and distinct from `engagement.saves`: a save keeps the video in a private collection on the platform, a download takes a copy off it, and TikTok counts the two separately. Present on TikTok post, search and post-list responses; absent everywhere else."
                                      },
                                      "region": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only: the country TikTok registers the video to, as an ISO 3166-1 alpha-2 code (normally the creator's account country when they posted). It is not the viewer's country, not the `region` you requested, and not a language. On `/v1/tiktok/trending`, `/v1/tiktok/search`, `/v1/tiktok/search/top`, `/v1/tiktok/profile/videos`, `/v1/tiktok/search/hashtag` and `/v1/tiktok/song/videos` it is how you tell which rows are from a given country: filter on it when you need only that country. A row whose source omits the country stays null. The `region` request parameter still only sets the proxy."
                                      },
                                      "subreddit": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Reddit subreddit name (search/list items): pass to `/v1/reddit/subreddit/details?subreddit=`"
                                      },
                                      "title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.title"
                                      },
                                      "selftext": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.selftext"
                                      },
                                      "upvote_ratio": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Reddit only: the share of a post's votes that are upvotes, as a fraction from 0 to 1 and usually close to 1 (six live rows measured 1, 1, 1, 0.86, 0.75, 1). Fractional despite the integer type this schema emits for every numeric leaf, the same caveat as `author.ext.average_rating`. Populated on `/v1/reddit/search` rows whose source carries it, and null everywhere else on Reddit including `/v1/reddit/post` and `/v1/reddit/subreddit`."
                                      },
                                      "flair": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.flair"
                                      },
                                      "content_language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The language the platform itself tags the post with, when it sends one: Reddit's own language tag on Reddit lanes, and TikTok's caption-language tag (for example `de`) on `/v1/tiktok/trending?feed=local`. Null when the platform could not tell (Reddit `und`, TikTok `un`, common on short or emoji-only captions); absent where the source sends no tag. Never inferred from the text by us: that is `post.computed.language`."
                                      },
                                      "type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.type"
                                      },
                                      "content_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.content_type"
                                      },
                                      "ticker_symbols": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.ticker_symbols",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.ticker_symbols"
                                        }
                                      },
                                      "video_view_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram's legacy 3-second-view count. Historical: Instagram stopped serving it in August 2026 (removed from its web post surface along with the web play count), so fresh `/v1/instagram/post` lookups no longer carry it and no source can restore it. Use `engagement.views` (the play count) instead."
                                      },
                                      "ig_play_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram-only play count (`ig_play_count`). Since mid-July 2026 Instagram's headline play count (`engagement.views`) no longer includes Facebook crosspost views and equals this value; it is surfaced explicitly so you can tell the Instagram-only figure apart and detect any future re-divergence. For combined Instagram + Facebook reach, also fetch the Facebook crosspost via `/v1/facebook/post`. Present on `/v1/instagram/post/stats` and, since the August 2026 views fix, on `/v1/instagram/post` for video posts."
                                      },
                                      "repost_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.repost_count"
                                      },
                                      "media_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.media_type"
                                      },
                                      "text_truncated": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.text_truncated"
                                      },
                                      "ip_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.ip_location"
                                      },
                                      "carousel_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.carousel_count"
                                      },
                                      "remix_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.remix_count"
                                      },
                                      "audio_cluster_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Instagram's audio cluster for a reel, as an exact digit string: the id Instagram uses to group different uploads of the same sound. Present on `/v1/instagram/audio/reels` rows and on `/v1/instagram/profile/reels` with `include=stats`; absent on a row when it is not available and on every other surface."
                                      },
                                      "facebook_likes": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post share that was EXCLUDED from `engagement.likes` on this row. A post shared to Facebook arrives from some sources with its Facebook likes already folded into the Instagram count, so the share is subtracted and published here, which keeps `engagement.likes` the Instagram-only figure instagram.com shows on the post. Add the two together for the combined number. Absent when the read carried no Facebook share, and absent on a post whose owner hides the like count, because nothing can be subtracted from a null. A response that excluded a share also carries a note in `data._warnings`."
                                      },
                                      "facebook_comments": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post share that was EXCLUDED from `engagement.comments` on this row, the comment counterpart of `post.ext.facebook_likes`. Each leaf appears only for the count it actually changed, so a post whose likes are hidden but whose comments were reconciled carries this one alone."
                                      },
                                      "instagram_views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Instagram-only play count of a video, the same figure on every Instagram endpoint. `engagement.views` keeps each endpoint's established meaning: on `/v1/instagram/profile/reels`, `/v1/instagram/audio/reels`, `/v1/instagram/search/reels` and `/v1/instagram/search/hashtag` it can include the post's Facebook cross-post views, while on `/v1/instagram/post` and `/v1/instagram/post/stats` it is Instagram-only. Read this leaf when you compare one post across endpoints. Absent on photos and when the source did not report the Instagram-only figure."
                                      },
                                      "facebook_views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post part of a video's play count, the counterpart of `post.ext.instagram_views`. Present only when the source reported the Facebook part, or a combined total above the Instagram figure. Absent does not mean zero: some sources report the Instagram figure alone even for a cross-posted video."
                                      },
                                      "published_at_epoch": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Raw Unix epoch for `published_at` (seconds, or milliseconds when the upstream sent millis). Present only when the upstream sent a numeric epoch that was normalised to the ISO 8601 `published_at` string. Kept for one deprecation cycle for integrations pinned to the numeric form."
                                      },
                                      "usertags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.usertags",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.usertags"
                                        }
                                      },
                                      "coauthors": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram collaborative posts (the native \"Collab\" feature). The full list of co-author accounts on the post, as `{ id, username, full_name, is_verified, profile_pic_url }`. A collab post has ONE producer and appears in every co-author's grid, so `post.author` is whichever account created it, which is not necessarily the profile you queried. The complete set of accounts on a post is `post.author.username` plus every `username` in this array. An empty array means Instagram reports the post as NOT a collab; the field is absent on surfaces that carry no co-author signal, including `/v1/instagram/post` (its web source ships the field permanently empty, so use `/v1/instagram/post/stats` for a single post).",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram collaborative posts (the native \"Collab\" feature). The full list of co-author accounts on the post, as `{ id, username, full_name, is_verified, profile_pic_url }`. A collab post has ONE producer and appears in every co-author's grid, so `post.author` is whichever account created it, which is not necessarily the profile you queried. The complete set of accounts on a post is `post.author.username` plus every `username` in this array. An empty array means Instagram reports the post as NOT a collab; the field is absent on surfaces that carry no co-author signal, including `/v1/instagram/post` (its web source ships the field permanently empty, so use `/v1/instagram/post/stats` for a single post)."
                                        }
                                      },
                                      "music": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.music"
                                      },
                                      "sponsor_tags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram only: the brand accounts the post tags as its paid partner, as usernames (`[\"rolex\"]`). `[]` on a post with no partner tagged. Present on `/v1/instagram/post/stats`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram only: the brand accounts the post tags as its paid partner, as usernames (`[\"rolex\"]`). `[]` on a post with no partner tagged. Present on `/v1/instagram/post/stats`; absent on every other endpoint."
                                        }
                                      },
                                      "sponsored_disclosed": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "The platform's own disclosure that the post is paid or promotional: on Instagram the paid-partnership label (`is_paid_partnership`) or a tagged brand partner, on TikTok the label TikTok shows viewers (\"Paid partnership\", \"Commission paid\", \"Promotional content\"). `false` when the post carries the flag unset, null when it carries none. Present on `/v1/instagram/post/stats`, `/v1/instagram/search/reels` and `/v1/tiktok/search`; absent on every other endpoint."
                                      },
                                      "ai_label": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Instagram only: Instagram's AI-content label on the post, as the method Instagram reports: `classifier_score_high` (Instagram detected it, shown as \"Likely made with AI\"), `ai_created` or `ai_edited` (declared or detected as made or edited with AI). Null when the post carries no AI label. Present on `/v1/instagram/post/stats`; absent on every other endpoint."
                                      },
                                      "story_mentions": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: the accounts the story mentions with a mention sticker, as usernames in alphabetical order. `[]` when it mentions nobody. Present on `/v1/instagram/stories`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: the accounts the story mentions with a mention sticker, as usernames in alphabetical order. `[]` when it mentions nobody. Present on `/v1/instagram/stories`; absent on every other endpoint."
                                        }
                                      },
                                      "story_links": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: where the story's link stickers lead, as URLs in alphabetical order. Instagram wraps each link in its own redirect with a per-view click id; both are removed, so this is the destination itself. `[]` when the story has no link sticker. Present on `/v1/instagram/stories` and `/v1/instagram/highlight/detail`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: where the story's link stickers lead, as URLs in alphabetical order. Instagram wraps each link in its own redirect with a per-view click id; both are removed, so this is the destination itself. `[]` when the story has no link sticker. Present on `/v1/instagram/stories` and `/v1/instagram/highlight/detail`; absent on every other endpoint."
                                        }
                                      },
                                      "story_reshared_posts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: the feed posts the story reshares, as post URLs (`https://www.instagram.com/p/{shortcode}/`, which `/v1/instagram/post` takes). `[]` when it reshares none. Present on `/v1/instagram/stories`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: the feed posts the story reshares, as post URLs (`https://www.instagram.com/p/{shortcode}/`, which `/v1/instagram/post` takes). `[]` when it reshares none. Present on `/v1/instagram/stories`; absent on every other endpoint."
                                        }
                                      },
                                      "location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.location"
                                      },
                                      "media": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.media",
                                        "items": {
                                          "type": "object",
                                          "description": "Nested object: post.ext.media",
                                          "properties": {
                                            "type": {
                                              "type": "string",
                                              "description": "Leaf at post.ext.media.type"
                                            },
                                            "url": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.media.url"
                                            },
                                            "width": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.media.width"
                                            },
                                            "height": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.media.height"
                                            }
                                          }
                                        }
                                      },
                                      "top_comments": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.top_comments",
                                        "items": {
                                          "type": "object",
                                          "description": "Nested object: post.ext.top_comments",
                                          "properties": {
                                            "id": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.id"
                                            },
                                            "text": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.text"
                                            },
                                            "username": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.username"
                                            },
                                            "likes": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.top_comments.likes"
                                            },
                                            "published_at": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.published_at"
                                            }
                                          }
                                        }
                                      },
                                      "hashtags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.hashtags",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.hashtags"
                                        }
                                      },
                                      "mentions": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.mentions",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.mentions"
                                        }
                                      },
                                      "mentioned_user_ids": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.mentioned_user_ids",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.mentioned_user_ids"
                                        }
                                      },
                                      "quoted_post": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Threads quote posts: the post this one quotes, as `{ id, url, author: { id, username }, text, media_urls, thumbnail_url }`. A quote post usually carries no caption or media of its own, and the text and video you see on the post's page belong to this attachment, by a different author. It is returned here rather than merged into `post.content`, so `content.*` always stays the outer post's own content and one account's media is never attributed to another. Absent on posts that are not quote posts."
                                      },
                                      "retweeted_post": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.retweeted_post"
                                      },
                                      "quote_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.quote_count"
                                      },
                                      "all_media_urls": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.all_media_urls",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.all_media_urls"
                                        }
                                      },
                                      "reaction_counts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.reaction_counts",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.reaction_counts"
                                        }
                                      },
                                      "share_urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.share_urn"
                                      },
                                      "post_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.post_type"
                                      },
                                      "activity_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.activity_id"
                                      },
                                      "published_at_precision": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.published_at_precision"
                                      },
                                      "author_urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_urn"
                                      },
                                      "author_headline": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_headline"
                                      },
                                      "author_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_type"
                                      },
                                      "is_repost_quote": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.is_repost_quote"
                                      },
                                      "article": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.article"
                                      },
                                      "reaction_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.reaction_type"
                                      },
                                      "download_media_urls": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.download_media_urls",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.download_media_urls"
                                        }
                                      },
                                      "tags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.tags",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.tags"
                                        }
                                      },
                                      "categoryId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.categoryId"
                                      },
                                      "categoryTitle": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.categoryTitle"
                                      },
                                      "topicCategories": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.topicCategories",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.topicCategories"
                                        }
                                      },
                                      "duration": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.duration"
                                      },
                                      "license": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.license"
                                      },
                                      "madeForKids": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.madeForKids"
                                      },
                                      "defaultAudioLanguage": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.defaultAudioLanguage"
                                      },
                                      "hasPaidProductPlacement": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.hasPaidProductPlacement"
                                      },
                                      "caption": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.caption"
                                      },
                                      "position": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.position"
                                      },
                                      "playlistId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlistId"
                                      },
                                      "videoOwnerChannelId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.videoOwnerChannelId"
                                      },
                                      "videoPublishedAt": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.videoPublishedAt"
                                      },
                                      "description": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.description"
                                      },
                                      "default_language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.default_language"
                                      },
                                      "localizations": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.localizations"
                                      },
                                      "playlist_item_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_item_id"
                                      },
                                      "playlist_owner_channel_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_owner_channel_id"
                                      },
                                      "playlist_owner_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_owner_title"
                                      },
                                      "channel_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.channel_id"
                                      },
                                      "published_label": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.published_label"
                                      },
                                      "published_precision": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.published_precision"
                                      },
                                      "title_maybe_translated": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.title_maybe_translated"
                                      },
                                      "video_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.video_count"
                                      },
                                      "posts_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "`/v1/instagram/hashtag` only: the exact number of public posts Instagram counts under the hashtag. Live: it moves between calls minutes apart."
                                      },
                                      "commerce": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.commerce"
                                      },
                                      "on_screen_texts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.on_screen_texts",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.on_screen_texts"
                                        }
                                      },
                                      "topic_tag": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.topic_tag"
                                      },
                                      "reshare_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.reshare_count"
                                      },
                                      "dsp_ids": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.dsp_ids"
                                      },
                                      "topic_tag_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.topic_tag_id"
                                      },
                                      "amazon_shop_lists": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_lists",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_lists"
                                        }
                                      },
                                      "amazon_shop_trending_picks": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_trending_picks",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_trending_picks"
                                        }
                                      },
                                      "amazon_shop_curations": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_curations",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_curations"
                                        }
                                      },
                                      "amazon_shop_socials": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_socials",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.amazon_shop_socials"
                                        }
                                      },
                                      "ad": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Ad Library envelope (Facebook `adlibrary/ad` and `adlibrary/company/ads` items): page_id, currency, spend, reach_estimate, publisher_platforms, categories, targeted_or_reached_countries, cta_text, cta_type, link_url, is_active, end_date_iso, display_format, title, video_hd_url, video_sd_url. Absent on every non-ad surface."
                                      },
                                      "apple_music": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.apple_music"
                                      },
                                      "feedback_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.feedback_id"
                                      },
                                      "question_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN (`/v1/naver/kin/search`) only: the question's id (Naver's `docId`), read from the row's link. Kin returns one row per answer, so several rows can share it; send `group=question` for one row per question."
                                      },
                                      "answer_no": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN only: which answer of the question this row is (Naver's `answerNo`), read from the row's link."
                                      },
                                      "answer_nos": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN with `group=question` only: every answer number of the question that was on the page, best-ranked first.",
                                        "items": {
                                          "type": "integer",
                                          "description": "Naver KnowledgeiN with `group=question` only: every answer number of the question that was on the page, best-ranked first."
                                        }
                                      },
                                      "published_at_est": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN only: the question's date ESTIMATED from its id (`YYYY-MM-DD`, Korea time), never a published date, so `published_at` stays null. Absent for questions older than the calibration table."
                                      },
                                      "date_basis": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "How `post.ext.published_at_est` was derived. `kin_docid_estimate`: interpolated from the question id against question pages whose posted date was read."
                                      },
                                      "event": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.event"
                                      },
                                      "trend": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Trend-board envelope: what TikTok's own trend board says about the row. On `/v1/tiktok/hashtags/popular`: `rank`, `country_code`, `period_days`, `posts` and `views` for the window (not lifetime totals), `industry` / `industry_id` / `industry_label` for the first board the hashtag was read from (null for the overall board), `boards` listing EVERY board it ranks on as `{ industry, industry_id, industry_label, rank }` in board order (so a hashtag in the top 3 overall and on an industry board shows both), `popularity_curve` as `{ date, value }` with value 0 to 100 relative to the window's peak, and `top_creators`. On `/v1/tiktok/videos/popular`: `rank`, `country_code`, `period_days`, `order_by`, `period_views`, `organic_views`, `engagement_rate`, `six_second_view_through_rate`, `content_tags`. Absent on every non-board surface."
                                      },
                                      "updated_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.updated_at"
                                      },
                                      "alt_text": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.alt_text"
                                      },
                                      "board_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.board_name"
                                      }
                                    }
                                  }
                                }
                              },
                              "computed": {
                                "type": "object",
                                "description": "Server-computed analytics fields (consistent across platforms)",
                                "properties": {
                                  "engagement_rate": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Computed engagement rate (0..1). Null when the upstream lacks enough signal."
                                  },
                                  "language": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "ISO 639-1 language code detected from the post text. Null when undetectable."
                                  },
                                  "content_category": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Keyword-classified content category (e.g. tech, food, gaming). Null when undetectable."
                                  },
                                  "estimated_reach": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Estimated reach based on views or follower count. Null when uncomputable."
                                  },
                                  "save_rate": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Numeric at computed.save_rate"
                                  },
                                  "relevance": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Nested object: computed.relevance",
                                    "properties": {
                                      "p": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.p"
                                      },
                                      "sense": {
                                        "type": "string",
                                        "description": "Leaf at computed.relevance.sense"
                                      },
                                      "depth": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.depth"
                                      },
                                      "spam": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.spam"
                                      }
                                    }
                                  },
                                  "labels": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Leaf at computed.labels"
                                  },
                                  "labels_evidence": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Leaf at computed.labels_evidence"
                                  }
                                }
                              }
                            }
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "reddit",
                  "endpoint": "/v1/reddit/profile/posts",
                  "data": {
                    "items": [
                      {
                        "post": {
                          "id": "1vgbkge",
                          "url": "https://www.reddit.com/user/spez/comments/1vgbkge/modernizing_reddits_infrastructure_with_you/",
                          "content": {
                            "text": "Modernizing Reddit’s infrastructure with you Hi everyone,\n\nLast May, I shared how we were building Reddit for its [next chapter](https://www.reddit.com/user/spez/comments/1kfciml/reddits_next_chapter_smarter_easier_still_human/). I owe you an update, including a few changes I know some people will have strong opinions about.\n\nWhile we’ve made upgrades to the platform over the last [21 years](https://www.reddit.com/user/spez/comments/1u7hraf/21_years_of_reddit/), we need to continually evolve to meet the rising expectations of everyone—mods, users, developers. Namely, starting and moderating a community should be easier than it is today. New users should be able to easily discover and participate in communities they’re interested in. And we need to make it harder for bad actors to scrape and sell Reddit data.\n\n# Where we’re heading\n\nTo thrive for another 21 years (and hopefully more), we need to rethink some of our legacy systems. None of this is changing today. We’re sharing with you early because we need your input to get it right.\n\nHere’s what’s on the table:\n\n**Old Reddit:** I know I said [last year](https://www.reddit.com/user/spez/comments/1kfciml/reddits_next_chapter_smarter_easier_still_human/) that we wouldn’t be sunsetting Old Reddit (I even made a [meme](https://www.reddit.com/media?url=https%3A%2F%2Fcf.preview.redd.it%2Freddits-next-chapter-smarter-easier-still-human-v0-prh1c0ewzyye1.png%3Fwidth%3D1080%26format%3Dpng%26auto%3Dwebp%26s%3Da7c0c1232475b695897ad9f226f6c4b50f1bef15) about it, which [r/agedlikemilk](https://www.reddit.com/r/agedlikemilk/)), but the reality is we’re getting to that time where we need to make some changes. There are four groups of people who use Old Reddit: OG users ❤️, OG mods ❤️, Admins ❤️, and everyone who spams, scrapes, or does anything bad on Reddit 🖕. In order to protect our platform, business, and users, we will need to do something. Actually, a lot of somethings. We have options: We can limit access, migrate important uses, or rebuild it on a modern tech stack, and I think we’ll probably do all of the above.\n\nI love Old Reddit. It’s the platform I largely built—as a kid, 21 years ago—that somehow turned into the amazing platform and company we have today. We will preserve as much of it as we can. My dream would be to recreate the UI, if not the guts, including the HTML+CSS itself, on a modern foundation so it can live on (note: Between when I wrote this and when I posted it, u/keysersosa made a demo of exactly this approach. Fingers crossed.).\n\nOne thing we can do in the short term to mitigate the bad behavior we see Old Reddit used for is to limit access to logged-in users and mods, and migrate critical bots and mod workflows. This will give us some time to plan the more complex follow-up steps.\n\n**Automod:** This has been one of the most important mod tools. But it’s also hard to learn, hard to maintain, and heavily dependent on brittle keyword matching, regex, and inherited configurations that only a few people on a mod team, if any, understand. We can do better.\n\nWe’re building new systems, including giving mods LLMs and AI-assisted tools to help them tackle their low-hanging (but time-consuming) fruit, so they can spend more time cultivating their community and less time policing. u/Go_JasonWaterfalls will share more in r/modnews today.\n\n**Public API:** Reddit’s public API wasn’t designed for today’s scale, automated abuse, or commercial scraping. We want useful bots, community tools, and good-faith developers to have a clear, well-supported way to build on Reddit. We don’t want bad actors to scrape Reddit indiscriminately, resell its data, or use it without accountability. \n\nTo ensure a safe and secure Reddit, we're working with developers to build exclusively on Reddit's Developer Platform. u/KeyserSosa will share more in r/redditdev today.\n\n**How people find and contribute to communities:** New users should be able to easily find relevant communities, understand their rules and norms, and make useful contributions. Today, new users encounter invisible barriers like account age and karma thresholds, unclear removals, and poor community discovery. \n\nThose safeguards exist for good reasons, including spam, brigading, and ban evasion. Our goal here is to improve Reddit’s systems and moderation tools so communities can rely less on blunt limits like karma and account age, and more on stronger abuse prevention built into the systems they use. This will make it easier for genuine new users to participate and easier for mods to welcome them with confidence.\n\n# How we’ll do this\n\nWe know announcements about APIs and legacy products come with some [baggage](https://www.reddit.com/r/place/comments/159lksc/claim_your_i_was_here_ticket/). “Trust us” isn’t good enough. If we’re asking you to move to something new, it has to be at parity or better in practice, not just in theory. Here are the principles we'll use across this work:\n\n* None of this is changing now or has a set end date\n* We won’t remove major capabilities before there is a credible replacement\n* We’ll work directly with the mods, developers, and communities that depend on these systems\n* We’ll share milestones along the way before any of these changes land\n* We’ll judge success by outcomes: better tools, less abuse, less mod work, and healthier communities\n\n# What we need from you\n\n* **Developers:** If you build or maintain an app, [register it](https://developers.reddit.com/app-registration) and tell us what support would be needed to unblock migration. More on r/redditdev here. [LINK](https://www.reddit.com/r/redditdev/comments/1vgbm9c/our_plans_for_the_future_of_reddits_public_data/)\n* **Mods:** If your community depends on a bot someone else maintains, [tell us that too](https://forms.gle/htmmJ1Rbv7fotxLP6). And if you want to test new tooling, [sign up for the Mod Early Access program](https://survey.alchemer.com/s3/8688309/Reddit-Feedback-Roster). More on r/modnews here. [LINK](https://www.reddit.com/r/modnews/comments/1vgbt2j/whats_next_for_mod_tools/)\n* **Everyone:** If you want to give us feedback as we work on any of the changes we’ve mentioned, sign up [here](https://survey.alchemer.com/s3/8688309/Reddit-Feedback-Roster). \n\nOur motivation behind all these changes is to make Reddit better for our users, mods, and communities who make Reddit what it is, and to limit the impact from those who take advantage of our platform or abuse our users and communities. \n\nWe’re sharing this early so that the people who use these systems can help shape what comes next and ensure these changes make Reddit better for everyone.\n\n\\- u/spez\n\nedit: added links",
                            "media_urls": null,
                            "thumbnail_url": null,
                            "duration_seconds": null
                          },
                          "author": {
                            "username": "spez",
                            "display_name": "user_1b921f",
                            "avatar_url": "https://example.com/avatars/user_350ced.png",
                            "verified": null
                          },
                          "engagement": {
                            "views": null,
                            "likes": 350,
                            "comments": 471,
                            "shares": null,
                            "saves": null
                          },
                          "flags": {
                            "nsfw": false,
                            "spoiler": null,
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2026-08-05T16:03:56.264Z",
                          "ext": {
                            "subreddit": null,
                            "title": "Modernizing Reddit’s infrastructure with you",
                            "selftext": "Hi everyone,\n\nLast May, I shared how we were building Reddit for its [next chapter](https://www.reddit.com/user/spez/comments/1kfciml/reddits_next_chapter_smarter_easier_still_human/). I owe you an update, including a few changes I know some people will have strong opinions about.\n\nWhile we’ve made upgrades to the platform over the last [21 years](https://www.reddit.com/user/spez/comments/1u7hraf/21_years_of_reddit/), we need to continually evolve to meet the rising expectations of everyone—mods, users, developers. Namely, starting and moderating a community should be easier than it is today. New users should be able to easily discover and participate in communities they’re interested in. And we need to make it harder for bad actors to scrape and sell Reddit data.\n\n# Where we’re heading\n\nTo thrive for another 21 years (and hopefully more), we need to rethink some of our legacy systems. None of this is changing today. We’re sharing with you early because we need your input to get it right.\n\nHere’s what’s on the table:\n\n**Old Reddit:** I know I said [last year](https://www.reddit.com/user/spez/comments/1kfciml/reddits_next_chapter_smarter_easier_still_human/) that we wouldn’t be sunsetting Old Reddit (I even made a [meme](https://www.reddit.com/media?url=https%3A%2F%2Fcf.preview.redd.it%2Freddits-next-chapter-smarter-easier-still-human-v0-prh1c0ewzyye1.png%3Fwidth%3D1080%26format%3Dpng%26auto%3Dwebp%26s%3Da7c0c1232475b695897ad9f226f6c4b50f1bef15) about it, which [r/agedlikemilk](https://www.reddit.com/r/agedlikemilk/)), but the reality is we’re getting to that time where we need to make some changes. There are four groups of people who use Old Reddit: OG users ❤️, OG mods ❤️, Admins ❤️, and everyone who spams, scrapes, or does anything bad on Reddit 🖕. In order to protect our platform, business, and users, we will need to do something. Actually, a lot of somethings. We have options: We can limit access, migrate important uses, or rebuild it on a modern tech stack, and I think we’ll probably do all of the above.\n\nI love Old Reddit. It’s the platform I largely built—as a kid, 21 years ago—that somehow turned into the amazing platform and company we have today. We will preserve as much of it as we can. My dream would be to recreate the UI, if not the guts, including the HTML+CSS itself, on a modern foundation so it can live on (note: Between when I wrote this and when I posted it, u/keysersosa made a demo of exactly this approach. Fingers crossed.).\n\nOne thing we can do in the short term to mitigate the bad behavior we see Old Reddit used for is to limit access to logged-in users and mods, and migrate critical bots and mod workflows. This will give us some time to plan the more complex follow-up steps.\n\n**Automod:** This has been one of the most important mod tools. But it’s also hard to learn, hard to maintain, and heavily dependent on brittle keyword matching, regex, and inherited configurations that only a few people on a mod team, if any, understand. We can do better.\n\nWe’re building new systems, including giving mods LLMs and AI-assisted tools to help them tackle their low-hanging (but time-consuming) fruit, so they can spend more time cultivating their community and less time policing. u/Go_JasonWaterfalls will share more in r/modnews today.\n\n**Public API:** Reddit’s public API wasn’t designed for today’s scale, automated abuse, or commercial scraping. We want useful bots, community tools, and good-faith developers to have a clear, well-supported way to build on Reddit. We don’t want bad actors to scrape Reddit indiscriminately, resell its data, or use it without accountability. \n\nTo ensure a safe and secure Reddit, we're working with developers to build exclusively on Reddit's Developer Platform. u/KeyserSosa will share more in r/redditdev today.\n\n**How people find and contribute to communities:** New users should be able to easily find relevant communities, understand their rules and norms, and make useful contributions. Today, new users encounter invisible barriers like account age and karma thresholds, unclear removals, and poor community discovery. \n\nThose safeguards exist for good reasons, including spam, brigading, and ban evasion. Our goal here is to improve Reddit’s systems and moderation tools so communities can rely less on blunt limits like karma and account age, and more on stronger abuse prevention built into the systems they use. This will make it easier for genuine new users to participate and easier for mods to welcome them with confidence.\n\n# How we’ll do this\n\nWe know announcements about APIs and legacy products come with some [baggage](https://www.reddit.com/r/place/comments/159lksc/claim_your_i_was_here_ticket/). “Trust us” isn’t good enough. If we’re asking you to move to something new, it has to be at parity or better in practice, not just in theory. Here are the principles we'll use across this work:\n\n* None of this is changing now or has a set end date\n* We won’t remove major capabilities before there is a credible replacement\n* We’ll work directly with the mods, developers, and communities that depend on these systems\n* We’ll share milestones along the way before any of these changes land\n* We’ll judge success by outcomes: better tools, less abuse, less mod work, and healthier communities\n\n# What we need from you\n\n* **Developers:** If you build or maintain an app, [register it](https://developers.reddit.com/app-registration) and tell us what support would be needed to unblock migration. More on r/redditdev here. [LINK](https://www.reddit.com/r/redditdev/comments/1vgbm9c/our_plans_for_the_future_of_reddits_public_data/)\n* **Mods:** If your community depends on a bot someone else maintains, [tell us that too](https://forms.gle/htmmJ1Rbv7fotxLP6). And if you want to test new tooling, [sign up for the Mod Early Access program](https://survey.alchemer.com/s3/8688309/Reddit-Feedback-Roster). More on r/modnews here. [LINK](https://www.reddit.com/r/modnews/comments/1vgbt2j/whats_next_for_mod_tools/)\n* **Everyone:** If you want to give us feedback as we work on any of the changes we’ve mentioned, sign up [here](https://survey.alchemer.com/s3/8688309/Reddit-Feedback-Roster). \n\nOur motivation behind all these changes is to make Reddit better for our users, mods, and communities who make Reddit what it is, and to limit the impact from those who take advantage of our platform or abuse our users and communities. \n\nWe’re sharing this early so that the people who use these systems can help shape what comes next and ensure these changes make Reddit better for everyone.\n\n\\- u/spez\n\nedit: added links",
                            "upvote_ratio": 0.841796875,
                            "flair": null,
                            "content_language": "en",
                            "published_at_epoch": 1785945836
                          }
                        },
                        "computed": {
                          "engagement_rate": null,
                          "language": "en",
                          "content_category": "tech",
                          "estimated_reach": null
                        }
                      },
                      {
                        "post": {
                          "id": "1u7hraf",
                          "url": "https://www.reddit.com/user/spez/comments/1u7hraf/21_years_of_reddit/",
                          "content": {
                            "text": "21 years of Reddit Hi everyone,\n\nReddit turns 21 next week. Funny enough, it’s the same age I was when we started it. Save your jokes about r/13or30, I’ve already [heard them](https://i.redd.it/mup6rvwj0o7h1.png).\n\nThat’s a long time in human years and an even longer time in internet years.\n\nWhen a few of us started Reddit back in 2005, the idea was simple: make it easier to find interesting things online. So we built a place where people could share links.\n\nAnd the links became prompts for conversations because people naturally like to talk about stuff. One of the first inside jokes on Reddit was, *\"I didn't read the article but… \\[insert 2000 words on the topic\\]\"* because people are more interested in the conversation than the content itself. \n\n(It’s not only [inside jokes](https://www.reddit.com/r/tifu/comments/2tdbig/tifu_by_enraging_the_parents_of_my_girlfriend_by/), though. Sometimes it’s [heartfelt condolences](https://www.reddit.com/r/AskReddit/comments/5c79n0/comment/d9uf56l/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button).)\n\nAnd what started as a place to share links evolved, for the better, into a place to form communities. What we didn’t realize at the time was that 21 years later, those communities would become one of the last places online where you can still reliably hear from real people on almost any topic imaginable.\n\nThe internet has become more powerful, automated, and optimized for attention. And on social media, everything feels performative: one big stage, one big feed, and someone (or some thing!) fighting for your attention.\n\nBut most people don’t want to perform.\n\nThey want to ask personal questions and get advice from someone who’s been there. They want to compare experiences, learn from others, and find people who care about the same things they do.\n\nReddit works because it’s not one giant conversation. It’s a constellation of communities, each with its own culture, norms, and rules.\n\nOver the last couple of decades, I’ve learned that when people gather around shared interests, they act less like performers and more like neighbors (even if sometimes the [r/neighborsfromhell](https://www.reddit.com/r/neighborsfromhell) kind). When communities set their own rules, they protect what makes those spaces valuable. And when people can speak anonymously, they’re often more honest.\n\nFor a long time, people assumed the future of the internet would be more tied to real-world identity. But one of the things Reddit has shown is that pseudonymity can create safety, honesty, and participation. On Reddit, you can openly talk about the things you care about—or are struggling with—without having your identity be part of the story.\n\nAs AI becomes more pervasive, that kind of human conversation only becomes more important. Real opinions, lived experience, and personal judgment matter more when the rest of the internet is filling up with synthetic content.\n\nI shared in [March](https://www.reddit.com/user/spez/comments/1s3ezrc/humans_welcome_bots_must_wear_name_tags/) how we’re protecting Reddit’s authenticity without sacrificing your anonymity, and we’ll keep building in that direction.\n\nSince then, we’ve continued to defend Reddit against automated/bot/spammy content, including making it[ harder to scrape Reddit at scale](https://www.reddit.com/r/modnews/comments/1tq9vxo/protecting_communities_from_scrapers_and_platform/), creating proactive moderation models that prevent up to 23 million spam views per day, and guarding against vote manipulation by revoking nearly 2 million inauthentic votes per day.\n\nBecause the value of Reddit has never been the interface (unless you’re the [Old Reddit](https://old.reddit.com/) type, I know there are still dozens of you out there). It’s never been the algorithm. And it’s never been polished, sanitized content.\n\nThe value of Reddit is you.\n\nEverything interesting about Reddit has been created by its people: the communities, the comments, the inside jokes, the rare insults, the niche expertise, the support, the debates, the brutal honesty, and the countless times someone took a minute to help a stranger for no reason other than they could.\n\nThat is the human internet that’s worth protecting.\n\nThank you for spending these last 21 years with us. I’m excited to see what the next 21 will hold.\n\n\\- u/spez",
                            "media_urls": null,
                            "thumbnail_url": null,
                            "duration_seconds": null
                          },
                          "author": {
                            "username": "spez",
                            "display_name": "user_1b921f",
                            "avatar_url": "https://example.com/avatars/user_350ced.png",
                            "verified": null
                          },
                          "engagement": {
                            "views": null,
                            "likes": 904,
                            "comments": 298,
                            "shares": null,
                            "saves": null
                          },
                          "flags": {
                            "nsfw": false,
                            "spoiler": null,
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2026-06-16T16:04:27.655Z",
                          "ext": {
                            "subreddit": null,
                            "title": "21 years of Reddit",
                            "selftext": "Hi everyone,\n\nReddit turns 21 next week. Funny enough, it’s the same age I was when we started it. Save your jokes about r/13or30, I’ve already [heard them](https://i.redd.it/mup6rvwj0o7h1.png).\n\nThat’s a long time in human years and an even longer time in internet years.\n\nWhen a few of us started Reddit back in 2005, the idea was simple: make it easier to find interesting things online. So we built a place where people could share links.\n\nAnd the links became prompts for conversations because people naturally like to talk about stuff. One of the first inside jokes on Reddit was, *\"I didn't read the article but… \\[insert 2000 words on the topic\\]\"* because people are more interested in the conversation than the content itself. \n\n(It’s not only [inside jokes](https://www.reddit.com/r/tifu/comments/2tdbig/tifu_by_enraging_the_parents_of_my_girlfriend_by/), though. Sometimes it’s [heartfelt condolences](https://www.reddit.com/r/AskReddit/comments/5c79n0/comment/d9uf56l/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button).)\n\nAnd what started as a place to share links evolved, for the better, into a place to form communities. What we didn’t realize at the time was that 21 years later, those communities would become one of the last places online where you can still reliably hear from real people on almost any topic imaginable.\n\nThe internet has become more powerful, automated, and optimized for attention. And on social media, everything feels performative: one big stage, one big feed, and someone (or some thing!) fighting for your attention.\n\nBut most people don’t want to perform.\n\nThey want to ask personal questions and get advice from someone who’s been there. They want to compare experiences, learn from others, and find people who care about the same things they do.\n\nReddit works because it’s not one giant conversation. It’s a constellation of communities, each with its own culture, norms, and rules.\n\nOver the last couple of decades, I’ve learned that when people gather around shared interests, they act less like performers and more like neighbors (even if sometimes the [r/neighborsfromhell](https://www.reddit.com/r/neighborsfromhell) kind). When communities set their own rules, they protect what makes those spaces valuable. And when people can speak anonymously, they’re often more honest.\n\nFor a long time, people assumed the future of the internet would be more tied to real-world identity. But one of the things Reddit has shown is that pseudonymity can create safety, honesty, and participation. On Reddit, you can openly talk about the things you care about—or are struggling with—without having your identity be part of the story.\n\nAs AI becomes more pervasive, that kind of human conversation only becomes more important. Real opinions, lived experience, and personal judgment matter more when the rest of the internet is filling up with synthetic content.\n\nI shared in [March](https://www.reddit.com/user/spez/comments/1s3ezrc/humans_welcome_bots_must_wear_name_tags/) how we’re protecting Reddit’s authenticity without sacrificing your anonymity, and we’ll keep building in that direction.\n\nSince then, we’ve continued to defend Reddit against automated/bot/spammy content, including making it[ harder to scrape Reddit at scale](https://www.reddit.com/r/modnews/comments/1tq9vxo/protecting_communities_from_scrapers_and_platform/), creating proactive moderation models that prevent up to 23 million spam views per day, and guarding against vote manipulation by revoking nearly 2 million inauthentic votes per day.\n\nBecause the value of Reddit has never been the interface (unless you’re the [Old Reddit](https://old.reddit.com/) type, I know there are still dozens of you out there). It’s never been the algorithm. And it’s never been polished, sanitized content.\n\nThe value of Reddit is you.\n\nEverything interesting about Reddit has been created by its people: the communities, the comments, the inside jokes, the rare insults, the niche expertise, the support, the debates, the brutal honesty, and the countless times someone took a minute to help a stranger for no reason other than they could.\n\nThat is the human internet that’s worth protecting.\n\nThank you for spending these last 21 years with us. I’m excited to see what the next 21 will hold.\n\n\\- u/spez",
                            "upvote_ratio": 0.9116575591985429,
                            "flair": null,
                            "content_language": "en",
                            "published_at_epoch": 1781625867
                          }
                        },
                        "computed": {
                          "engagement_rate": null,
                          "language": "en",
                          "content_category": "tech",
                          "estimated_reach": null
                        }
                      }
                    ],
                    "total": null,
                    "dropped": 0
                  },
                  "credits_used": 1,
                  "request_id": "req_example000000",
                  "cached": false,
                  "pagination": {
                    "next_cursor": null,
                    "has_more": false,
                    "page_size": 23
                  },
                  "credits_remaining": 9999,
                  "source": "captured",
                  "captured_at": "2026-10-02T07:33:12.822Z",
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/reddit/profile/comments": {
      "get": {
        "summary": "Read a Reddit account's own comment history, newest first, deeper than any search index reaches. Metered: 2 credits per comment returned, so try /v1/reddit/search/comments?query=author:name first",
        "description": "Returns the comments one Reddit account has written, newest first, read from the account's own listing rather than from a search index. **That distinction is the whole endpoint.** `/v1/reddit/search/comments?query=author:username` costs 1 credit for a page and looks like the same thing, but it reads Reddit's search index, which holds a small relevance-ranked subset: measured 07/09/2026 on one account, the search route returned 9 comments and then stopped, while this endpoint returned 60 in chronological order reaching back to 2021. **Start with the search route.** Come here when you need the history rather than a sample. Each row carries the comment text, the score, the permalink, the post it sits under at `post_id` and `ext.post_url`, the community at `ext.subreddit`, and a real `parent_id` — `t1_` on a reply and `t3_` on a top-level comment, so a comment whose `parent_id` equals its `post_id` is top-level. `ext.is_submitter` is Reddit's OP badge, true when the commenter also wrote the post they are replying under, and `ext.controversiality` is Reddit's own flag for a comment with roughly balanced up and down votes, which the score alone hides. `limit` is a real depth control and not a page size: a higher `limit` reaches further back, at the same speed. There is no cursor, because the depth control makes one unnecessary — ask for the depth you want in one call. **Pricing is metered at 2 credits per comment RETURNED**, so an account with fewer comments than your `limit` costs less than you asked for. A username that does not exist returns an empty list and costs nothing, and so does a real account that has never commented — this upstream cannot tell them apart, so call `/v1/reddit/profile` when you need to know which it was. When the main source is unavailable, a second source answers the same call with the same fields and the same price; on those rows `comment.text` is Reddit's own markdown, so a link reads `[text](url)`. A call with `before` has no second source and returns an error to retry.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_profile_comments",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 2,
        "x-credit-cost-min": 2,
        "x-credit-cost-max": 200,
        "x-credit-cost-formula": "2 credits per comment returned. A limit of 25 holds 50 credits and settles down to the number of comments that actually came back; an account with no comments costs nothing.",
        "parameters": [
          {
            "name": "handle",
            "in": "query",
            "required": true,
            "description": "Reddit username without the u/ prefix. Case-insensitive.",
            "schema": {
              "type": "string"
            },
            "example": "spez"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "How many comments to return, 1-100, default 25. This is a depth control, not a page size: a higher limit reaches further back into the account's history at the same speed.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "before",
            "in": "query",
            "required": false,
            "description": "Only return comments older than this date (YYYY-MM-DD). Use it to walk a long history in windows instead of raising limit.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Only rows published on or after this date: YYYY-MM-DD (midnight UTC) or an ISO 8601 timestamp. Rows older than it are left off each page. This list is not in date order, so the walk does not stop at the date: keep following `next_cursor`, and each page costs what a page costs even when every row on it is filtered out. A row with no date is kept. `published_after`, `start_date`, `from_date`, `publish_time` (`yesterday`, `this-week`, `this-month`, `last-3-months`, `last-6-months`) and `max_age_days` are accepted and applied as `since`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "until",
            "in": "query",
            "required": false,
            "description": "Only rows published on or before this date: YYYY-MM-DD (that whole UTC day is included) or an ISO 8601 timestamp. Newer rows are left off each page and the walk does not stop, so older pages follow. A row with no date is kept. `published_before`, `end_date` and `to_date` are accepted and applied as `until`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/profile/comments"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of canonical comment wrappers ({ comment })",
                          "items": {
                            "type": "object",
                            "description": "Canonical comment wrapper",
                            "properties": {
                              "comment": {
                                "type": "object",
                                "description": "Canonical Comment object (unified across all platforms)",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "Platform-specific comment ID (always a string)"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Direct URL to the comment on the source platform"
                                  },
                                  "parent_id": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Parent comment ID for nested replies, or null for top-level comments"
                                  },
                                  "post_id": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "ID of the post this comment belongs to"
                                  },
                                  "text": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Comment body. Tombstone sentinels ([deleted] / [removed]) are collapsed to null upstream: customers never see them."
                                  },
                                  "author": {
                                    "type": "object",
                                    "description": "Subset of Author fields for the comment author",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Comment author username (null when tombstoned)"
                                      },
                                      "display_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Comment author display name"
                                      },
                                      "avatar_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "URL to comment author profile picture"
                                      },
                                      "verified": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Whether the comment author is verified"
                                      }
                                    }
                                  },
                                  "engagement": {
                                    "type": "object",
                                    "description": "Engagement counts on the comment",
                                    "properties": {
                                      "likes": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Like / upvote count"
                                      },
                                      "replies": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Reply / child-comment count. `0` when the upstream structurally reports the count and the comment has no replies; `null` only when the upstream does not surface a reply count at all."
                                      }
                                    }
                                  },
                                  "flags": {
                                    "type": "object",
                                    "description": "Boolean flags on the comment",
                                    "properties": {
                                      "pinned": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Pinned flag (null when platform does not surface)"
                                      },
                                      "deleted": {
                                        "type": "boolean",
                                        "description": "Whether the comment is tombstoned (always present, even when false)"
                                      },
                                      "liked_by_creator": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "`/v1/instagram/post/comments` only: true when the post's creator liked (hearted) the comment, false when not, null when the source that served the call could not tell. Absent on every other endpoint."
                                      }
                                    }
                                  },
                                  "published_at": {
                                    "type": [
                                      "string",
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Comment creation timestamp as an ISO 8601 UTC string. When the upstream sent a Unix epoch it is converted here and the raw epoch is preserved under `comment.ext.published_at_epoch` for one deprecation cycle."
                                  },
                                  "ext": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Platform-specific passthrough tokens for reply expansion (present only on platforms that surface them)",
                                    "properties": {
                                      "replies_token": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "YouTube reply continuation token: pass to `/v1/youtube/video/comment/replies?continuationToken=`"
                                      },
                                      "replies_cursor": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Reddit reply-branch continuation cursor. Present when this comment's reply tree is truncated upstream: pass it back as `?cursor=` on `/v1/reddit/post/comments` to load the rest of the branch."
                                      },
                                      "depth": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Reddit comment nesting depth as the source reports it: 0 on a top-level comment, 1 on a direct reply, and so on. Present when the thread arrived flat and was re-nested into `replies[]`, so you can verify that nesting independently."
                                      },
                                      "published_at_epoch": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Raw Unix epoch for `published_at` (present only when the upstream sent a numeric epoch that was normalised to the ISO 8601 string)."
                                      },
                                      "feedback_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Facebook comment feedback id: feeds `/v1/facebook/post/comment/replies`"
                                      },
                                      "expansion_token": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Facebook comment expansion/paginator token: feeds `/v1/facebook/post/comment/replies`"
                                      },
                                      "author_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The commenter's platform-native numeric user id, where the upstream exposes one."
                                      },
                                      "ip_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.ip_location"
                                      },
                                      "urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.urn"
                                      },
                                      "reaction_counts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at comment.ext.reaction_counts",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at comment.ext.reaction_counts"
                                        }
                                      },
                                      "is_edited": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at comment.ext.is_edited"
                                      },
                                      "previous_replies_token": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.previous_replies_token"
                                      },
                                      "author_headline": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.author_headline"
                                      },
                                      "updated_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.updated_at"
                                      },
                                      "author_channel_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.author_channel_id"
                                      },
                                      "author_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.author_url"
                                      },
                                      "viewer_rating": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.viewer_rating"
                                      },
                                      "text_original": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.text_original"
                                      },
                                      "preview_replies": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at comment.ext.preview_replies",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at comment.ext.preview_replies"
                                        }
                                      },
                                      "lookup": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at comment.ext.lookup"
                                      },
                                      "post_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_title"
                                      },
                                      "post_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_url"
                                      },
                                      "subreddit": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.subreddit"
                                      },
                                      "subreddit_subscribers": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at comment.ext.subreddit_subscribers"
                                      },
                                      "post_score": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at comment.ext.post_score"
                                      },
                                      "post_comment_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at comment.ext.post_comment_count"
                                      },
                                      "post_author": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_author"
                                      },
                                      "post_published_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_published_at"
                                      },
                                      "post_flair": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_flair"
                                      },
                                      "is_submitter": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at comment.ext.is_submitter"
                                      },
                                      "edited_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.edited_at"
                                      },
                                      "controversiality": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at comment.ext.controversiality"
                                      },
                                      "content_language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "ISO 639-1 language tag for this comment, when the source reports one. X writes `zxx` / `und` for no linguistic content; those collapse to null."
                                      },
                                      "author_followers": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The commenter's follower count as embedded in this row. Snapshot as of whenever the replies source saw the account, not a live figure. On X this is present on every `tweet/replies` row."
                                      },
                                      "author_following": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The commenter's following count as embedded in this row. Same snapshot caveat as `author_followers`."
                                      },
                                      "author_posts_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The commenter's post count as embedded in this row. Same snapshot caveat as `author_followers`."
                                      },
                                      "author_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.author_location"
                                      },
                                      "quote_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "How many quote-posts this comment has, when the source reports it. On X a reply is a tweet, so this is the same figure `post.ext.quote_count` carries on tweet lanes."
                                      },
                                      "views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "View count for this comment, when the source reports it. On X a reply is a tweet and the count is public on posts from ~2022 onward."
                                      },
                                      "saves": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Bookmark / save count for this comment, when the source reports it. On X this is `legacy.bookmark_count`."
                                      }
                                    }
                                  },
                                  "replies": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Nested reply tree: array of child comments, each itself a full Comment object with its own `replies`. Populated on threaded platforms (Reddit); absent on flat-comment platforms, which thread only via `parent_id`.",
                                    "items": {
                                      "type": "object",
                                      "description": "Nested reply tree: array of child comments, each itself a full Comment object with its own `replies`. Populated on threaded platforms (Reddit); absent on flat-comment platforms, which thread only via `parent_id`."
                                    }
                                  }
                                }
                              }
                            }
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "youtube",
                  "endpoint": "/v1/youtube/video/comments",
                  "data": {
                    "items": [
                      {
                        "comment": {
                          "id": "Ugzge340dBgB75hWBm54AaABAg",
                          "url": null,
                          "parent_id": null,
                          "post_id": "dQw4w9WgXcQ",
                          "text": "Sample comment text (redacted).",
                          "author": {
                            "username": "user_607bca",
                            "display_name": "user_607bca",
                            "avatar_url": "https://example.com/avatars/user_b3bde6.png",
                            "verified": null
                          },
                          "engagement": {
                            "likes": 322497,
                            "replies": 1000
                          },
                          "flags": {
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2025-04-22T19:05:08.000Z",
                          "ext": {
                            "replies_token": "sc2.eyJzIjoiYSIsImMiOiJVZ3pnZTM0MGRCZ0I3NWhXQm01NEFhQUJBZyJ9",
                            "updated_at": "2025-04-22T19:05:08Z",
                            "author_channel_id": "user_0faa89",
                            "author_url": "https://example.com/user_fa30a8",
                            "viewer_rating": "Sample comment text (redacted).",
                            "text_original": "Sample comment text (redacted).",
                            "preview_replies": [
                              {
                                "id": "Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHE9eIiztxR",
                                "channelId": "user_b70959",
                                "videoId": "dQw4w9WgXcQ",
                                "textDisplay": "Sample comment text (redacted).",
                                "textOriginal": "Sample comment text (redacted).",
                                "parentId": "Ugzge340dBgB75hWBm54AaABAg",
                                "authorDisplayName": "user_a07ce6",
                                "authorProfileImageUrl": "https://example.com/avatars/user_b7fd7d.png",
                                "authorChannelUrl": "https://example.com/user_7ab559",
                                "authorChannelId": {
                                  "value": "user_5afaba"
                                },
                                "canRate": true,
                                "viewerRating": "Sample comment text (redacted).",
                                "likeCount": 7573,
                                "publishedAt": "2025-04-22T19:14:32Z",
                                "updatedAt": "2025-04-22T19:14:32Z"
                              },
                              {
                                "id": "Ugzge340dBgB75hWBm54AaABAg.AHE8_QAWJx9AHEAB_-JmDA",
                                "channelId": "user_b70959",
                                "videoId": "dQw4w9WgXcQ",
                                "textDisplay": "Sample comment text (redacted).",
                                "textOriginal": "Sample comment text (redacted).",
                                "parentId": "Ugzge340dBgB75hWBm54AaABAg",
                                "authorDisplayName": "user_d8b3d6",
                                "authorProfileImageUrl": "https://example.com/avatars/user_2ece01.png",
                                "authorChannelUrl": "https://example.com/user_7a3f35",
                                "authorChannelId": {
                                  "value": "user_da87da"
                                },
                                "canRate": true,
                                "viewerRating": "Sample comment text (redacted).",
                                "likeCount": 3180,
                                "publishedAt": "2025-04-22T19:19:13Z",
                                "updatedAt": "2025-04-22T19:19:13Z"
                              }
                            ]
                          }
                        },
                        "computed": {
                          "language": "en",
                          "labels": {
                            "sentiment": {
                              "level": 3,
                              "score_0_1": 0.85,
                              "confidence": 0.61
                            },
                            "question": {
                              "p": 0.03
                            },
                            "purchase_intent": {
                              "p": 0.02
                            },
                            "complaint": {
                              "p": 0.04
                            }
                          }
                        }
                      },
                      {
                        "comment": {
                          "id": "UgzjClLu_KHsDVWheGx4AaABAg",
                          "url": null,
                          "parent_id": null,
                          "post_id": "dQw4w9WgXcQ",
                          "text": "Sample comment text (redacted).",
                          "author": {
                            "username": "user_f90324",
                            "display_name": "user_f90324",
                            "avatar_url": "https://example.com/avatars/user_191ddb.png",
                            "verified": null
                          },
                          "engagement": {
                            "likes": 1,
                            "replies": 0
                          },
                          "flags": {
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2026-10-02T15:39:20.000Z",
                          "ext": {
                            "replies_token": "sc2.eyJzIjoiYSIsImMiOiJVZ3pqQ2xMdV9LSHNEVldoZUd4NEFhQUJBZyJ9",
                            "updated_at": "2026-10-02T15:39:20Z",
                            "author_channel_id": "user_121069",
                            "author_url": "https://example.com/user_ec3ca5",
                            "viewer_rating": "Sample comment text (redacted).",
                            "text_original": "Sample comment text (redacted)."
                          }
                        },
                        "computed": {
                          "language": "en",
                          "labels": {
                            "sentiment": {
                              "level": 3,
                              "score_0_1": 0.76,
                              "confidence": 0.8
                            },
                            "question": {
                              "p": 0.02
                            },
                            "purchase_intent": {
                              "p": 0.02
                            },
                            "complaint": {
                              "p": 0.03
                            }
                          }
                        }
                      }
                    ],
                    "next_cursor": "sc2.eyJzIjoiYSIsImMiOiJzYzEuZXlKaklqb2lXakpXTUZneU5XeGtNbFo2WkVZNWJXRllTbnBrUXpCMFVUSmtibE5YWkVKVlZscEhUakphVTFRd1NrcFNhMDVPV2pKa1NGRlZSbFJSYkVad1drVnNRMW93U2taYU1WWktZVlZPUWxkVlJrTlRWVnBFVXpKa2JsSXdSa0pWTUVwU1lWVm9TbEZ0WkVKU1YyUldVMWMxY0ZGV2JFSlJhMnhIVVRCc2Nsb3daRUpSVjJ4RldqSTVUbEV3ZEd4YU1UZzFWbFZrUmxNeWF6Rk9SWEJDVWtaV1FsRnNiRUpWVVQwOUlpd2ljeUk2V3lKVlozcG5aVE0wTUdSQ1owSTNOV2hYUW0wMU5FRmhRVUpCWnlJc0lsVm5lbXBEYkV4MVgwdEljMFJXVjJobFIzZzBRV0ZCUWtGbklsMTkifQ",
                    "total": null,
                    "labels": {
                      "presets": [
                        "sentiment",
                        "question"
                      ],
                      "rows": 2,
                      "labelled": 2,
                      "cached": 1,
                      "skipped": 0,
                      "unjudged": 0,
                      "dropped": 0,
                      "dropped_ids": [],
                      "extra_credits": 0,
                      "methodology_version": "labels/1",
                      "mode": "default",
                      "status": "complete",
                      "pending": 0,
                      "pending_ids": []
                    },
                    "label_share": {
                      "policy_version": "share/1",
                      "presets": {
                        "question": {
                          "n": 2,
                          "counted": 0,
                          "abstained": 0,
                          "share": null,
                          "low": 0,
                          "high": 0.575,
                          "receipts": [],
                          "policy_version": "share/1",
                          "too_few": true,
                          "at_cut": 0,
                          "nulls": 0,
                          "low_confidence": 0
                        },
                        "purchase_intent": {
                          "n": 2,
                          "counted": 0,
                          "abstained": 0,
                          "share": null,
                          "low": 0,
                          "high": 0.575,
                          "receipts": [],
                          "policy_version": "share/1",
                          "too_few": true,
                          "at_cut": 0,
                          "nulls": 0,
                          "low_confidence": 0
                        },
                        "complaint": {
                          "n": 2,
                          "counted": 0,
                          "abstained": 0,
                          "share": null,
                          "low": 0,
                          "high": 0.575,
                          "receipts": [],
                          "policy_version": "share/1",
                          "too_few": true,
                          "at_cut": 0,
                          "nulls": 0,
                          "low_confidence": 0
                        },
                        "sentiment": {
                          "positive": {
                            "n": 2,
                            "counted": 2,
                            "abstained": 0,
                            "share": null,
                            "low": 0.425,
                            "high": 1,
                            "receipts": [
                              {
                                "id": "Ugzge340dBgB75hWBm54AaABAg",
                                "text": "Sample comment text (redacted)."
                              },
                              {
                                "id": "UgzjClLu_KHsDVWheGx4AaABAg",
                                "text": "Sample comment text (redacted)."
                              }
                            ],
                            "policy_version": "share/1",
                            "too_few": true,
                            "at_cut": 2,
                            "nulls": 0,
                            "low_confidence": 0
                          },
                          "neutral": {
                            "n": 2,
                            "counted": 0,
                            "abstained": 0,
                            "share": null,
                            "low": 0,
                            "high": 0.575,
                            "receipts": [],
                            "policy_version": "share/1",
                            "too_few": true,
                            "at_cut": 0,
                            "nulls": 0,
                            "low_confidence": 0
                          },
                          "negative": {
                            "n": 2,
                            "counted": 0,
                            "abstained": 0,
                            "share": null,
                            "low": 0,
                            "high": 0.575,
                            "receipts": [],
                            "policy_version": "share/1",
                            "too_few": true,
                            "at_cut": 0,
                            "nulls": 0,
                            "low_confidence": 0
                          }
                        }
                      }
                    },
                    "comment_language": {
                      "policy_version": "share/1",
                      "n": 2,
                      "abstained": 0,
                      "judged_by": {
                        "script": 0,
                        "choice": 2
                      },
                      "shares": {
                        "en": {
                          "n": 2,
                          "counted": 2,
                          "abstained": 0,
                          "share": null,
                          "low": 0.425,
                          "high": 1,
                          "receipts": [
                            {
                              "id": "Ugzge340dBgB75hWBm54AaABAg",
                              "text": "Sample comment text (redacted)."
                            },
                            {
                              "id": "UgzjClLu_KHsDVWheGx4AaABAg",
                              "text": "Sample comment text (redacted)."
                            }
                          ],
                          "policy_version": "share/1",
                          "too_few": true
                        }
                      }
                    },
                    "comment_recency": {
                      "policy_version": "d09-1",
                      "n": 2,
                      "counted": 2,
                      "abstained": 0,
                      "share_last_24h": 0.5,
                      "share_later_half": null,
                      "too_few": true,
                      "stage": "unknown",
                      "order": "top",
                      "recent_share_is_floor": true,
                      "receipts": [
                        {
                          "id": "UgzjClLu_KHsDVWheGx4AaABAg",
                          "text": "Sample comment text (redacted)."
                        }
                      ]
                    },
                    "dropped": 0
                  },
                  "credits_used": 1,
                  "credits_remaining": 9999,
                  "request_id": "req-8Kq2ZmR4vT9xLb3P",
                  "cached": false,
                  "pagination": {
                    "next_cursor": "sc.eyJ2IjoyLCJjIjoic2MyLmV5SnpJam9pWVNJc0ltTWlPaUp6WXpFdVpYbEtha2xxYjJsWGFrcFhUVVpuZVU1WGVHdE5iRm8yV2tWWk5XSlhSbGxUYm5CclVYcENNRlZVU210aWJFNVlXa1ZLVmxac2NFaFVha3BoVlRGUmQxTnJjRk5oTURWUFYycEthMU5HUmxaU2JGSlNZa1ZhZDFkclZuTlJNVzkzVTJ0YVlVMVdXa3RaVmxaUFVXeGtWbEpyVGxSV1ZuQkZWWHBLYTJKc1NYZFNhMHBXVFVWd1UxbFdWbTlUYkVaMFdrVktVMVl5VWxkVk1XTXhZMFpHVjJKRlNsSmhNbmhJVlZSQ2MyTnNiM2RhUlVwU1ZqSjRSbGRxU1RWVWJFVjNaRWQ0WVUxVVp6RldiRlpyVW14TmVXRjZSazlTV0VKRFZXdGFWMUZzUm5OaVJVcFdWVlF3T1VscGQybGplVWsyVjNsS1Zsb3pjRzVhVkUwd1RVZFNRMW93U1ROT1YyaFlVVzB3TVU1RlJtaFJWVXBDV25sSmMwbHNWbTVsYlhCRVlrVjRNVmd3ZEVsak1GSlhWakpvYkZJelp6QlJWMFpDVVd0R2JrbHNNVGtpZlEiLCJlIjoieW91dHViZS92aWRlby9jb21tZW50cyIsInAiOiJjb250aW51YXRpb25Ub2tlbiJ9",
                    "has_more": true,
                    "page_size": 2
                  },
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/reddit/search/comments": {
      "get": {
        "summary": "Search Reddit comments",
        "description": "Searches Reddit's COMMENT index directly, so a phrase that only ever appears three levels deep inside someone's reply is reachable in one call. Every other comment surface on this API needs a post you have already found; this one does not. Each hit arrives with its parent post inline, because a bare comment body off a search index is unreadable without it: `ext.post_title`, `ext.subreddit`, `ext.subreddit_subscribers`, `ext.post_score`, `ext.post_comment_count`, `ext.post_author`, `ext.post_published_at`, `ext.post_flair`, `ext.post_url` and `ext.content_language`. Reddit's search operators work in `query`, which is where most of the power is: `author:username` returns that account's indexed comments, `subreddit:name terms` scopes the sweep to one community, and quoted phrases tighten a loose match. `comment.parent_id` is null on this lane and that is honest rather than missing — the upstream does not say whether a hit is a top-level comment or a deep reply, and this API does not guess. Up to 25 hits per page; paginate with `cursor`. A query that matches nothing returns an empty `items` list and costs nothing. When the main source is unavailable, the first page is answered by a backup that reads the same comment index with the same fields, parent-post block included, and carries no next cursor. If that backup fails too, a third source answers with the same hits in the same order, up to 10 on a page, and its pages carry a next cursor that pages on that same source; on those pages `ext.subreddit_subscribers`, `ext.post_author`, `ext.post_flair`, `ext.content_language` and `author.display_name` are null, and the rest of the parent-post block is filled. If that fails as well, a fourth source answers the first page with the same hits but without the parent-post block, so `ext.post_title`, `ext.post_url`, `ext.subreddit_subscribers`, `ext.post_score`, `ext.post_comment_count`, `ext.post_author`, `ext.post_published_at`, `ext.post_flair`, `ext.content_language` and `author.avatar_url` are null on that page; `ext.subreddit` is still filled. A later page has no second source: it is answered by the source that served the page before it, and returns an error to retry when that source is unavailable.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_search_comments",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 1,
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search phrase. Reddit's operators work here: `author:username` for one account's comments, `subreddit:name terms` to scope to a community, and quotes for an exact phrase.",
            "schema": {
              "type": "string"
            },
            "example": "best project management software"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Sort order for the comment hits.",
            "schema": {
              "type": "string",
              "enum": [
                "relevance",
                "top",
                "new"
              ]
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Cursor to get more results. Get 'cursor' from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "switch_from",
            "in": "query",
            "required": false,
            "description": "Optional brand. data.switch_receipts lists comments where the author says they personally left that brand, with the verbatim text, the reason, where they went, and a link. There is no percentage. A comment that is not a switch, or that is not confident, is left out. No extra credits.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Only rows published on or after this date: YYYY-MM-DD (midnight UTC) or an ISO 8601 timestamp. Rows older than it are left off the page, and the page that reaches one ends the walk: `next_cursor` is not returned and `pagination.stopped_at` is `since`. Sending it sets the newest-first sort shown in this endpoint's sort parameter (any other sort value is a free 400). The page still costs what a page costs, so you pay for the pages you walk and no more. A row with no date is kept. `published_after`, `start_date`, `from_date`, `publish_time` (`yesterday`, `this-week`, `this-month`, `last-3-months`, `last-6-months`) and `max_age_days` are accepted and applied as `since`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "until",
            "in": "query",
            "required": false,
            "description": "Only rows published on or before this date: YYYY-MM-DD (that whole UTC day is included) or an ISO 8601 timestamp. Newer rows are left off each page and the walk does not stop, so older pages follow. A row with no date is kept. `published_before`, `end_date` and `to_date` are accepted and applied as `until`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_pages",
            "in": "query",
            "required": false,
            "description": "1 to 50 (default 1, or 50 when `max_items` or `max_credits` is sent). Walk up to this many pages in one call and return the rows from all of them. Each page walked is billed exactly as one call to this endpoint (a cached page is free) and counts against your rate limit; its charge and any refund are recorded under the page's own request id, listed in `data.walk.request_ids`. The walk stops early at the last page, or when the request's time budget runs low; `data.walk.stopped` says why (`end`, `max_pages`, `max_items`, `max_credits`, `time_budget`, `page_error`) and `pagination.next_cursor` continues from where it stopped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "max_items",
            "in": "query",
            "required": false,
            "description": "1 to 5000. Get more in one call: keep walking pages until the response holds at least this many rows, then stop with `data.walk.stopped: \"max_items\"`. The last page is returned whole (it was billed), so `data.items` can hold up to one page more than this, and `pagination.next_cursor` resumes right after it without skipping a row. Walks up to 50 pages unless `max_pages` says fewer; each page is billed as one call (a cached page is free). Add `max_credits` to cap the spend. A long walk can stop on the time budget first (`\"time_budget\"`): send the returned cursor with the same params to continue.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "max_credits",
            "in": "query",
            "required": false,
            "description": "1 to 100000. The most this call may spend, across every page it walks. A page starts only while the credits already spent plus that page's price (or, when higher, the most any page of this walk has cost) still fit, so the call never goes past it; the walk then stops with `data.walk.stopped: \"max_credits\"` and the cursor to resume. Sent alone, it walks as far as the budget goes (up to 50 pages). A value below the price of one page is a free 400 whose `error.details.page_credits` names that price. Credits a row join (`include=`) adds are known only once a page has run, so page 1 is checked against its own price.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/search/comments"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of canonical comment wrappers ({ comment })",
                          "items": {
                            "type": "object",
                            "description": "Canonical comment wrapper",
                            "properties": {
                              "comment": {
                                "type": "object",
                                "description": "Canonical Comment object (unified across all platforms)",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "Platform-specific comment ID (always a string)"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Direct URL to the comment on the source platform"
                                  },
                                  "parent_id": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Parent comment ID for nested replies, or null for top-level comments"
                                  },
                                  "post_id": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "ID of the post this comment belongs to"
                                  },
                                  "text": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Comment body. Tombstone sentinels ([deleted] / [removed]) are collapsed to null upstream: customers never see them."
                                  },
                                  "author": {
                                    "type": "object",
                                    "description": "Subset of Author fields for the comment author",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Comment author username (null when tombstoned)"
                                      },
                                      "display_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Comment author display name"
                                      },
                                      "avatar_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "URL to comment author profile picture"
                                      },
                                      "verified": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Whether the comment author is verified"
                                      }
                                    }
                                  },
                                  "engagement": {
                                    "type": "object",
                                    "description": "Engagement counts on the comment",
                                    "properties": {
                                      "likes": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Like / upvote count"
                                      },
                                      "replies": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Reply / child-comment count. `0` when the upstream structurally reports the count and the comment has no replies; `null` only when the upstream does not surface a reply count at all."
                                      }
                                    }
                                  },
                                  "flags": {
                                    "type": "object",
                                    "description": "Boolean flags on the comment",
                                    "properties": {
                                      "pinned": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Pinned flag (null when platform does not surface)"
                                      },
                                      "deleted": {
                                        "type": "boolean",
                                        "description": "Whether the comment is tombstoned (always present, even when false)"
                                      },
                                      "liked_by_creator": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "`/v1/instagram/post/comments` only: true when the post's creator liked (hearted) the comment, false when not, null when the source that served the call could not tell. Absent on every other endpoint."
                                      }
                                    }
                                  },
                                  "published_at": {
                                    "type": [
                                      "string",
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Comment creation timestamp as an ISO 8601 UTC string. When the upstream sent a Unix epoch it is converted here and the raw epoch is preserved under `comment.ext.published_at_epoch` for one deprecation cycle."
                                  },
                                  "ext": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Platform-specific passthrough tokens for reply expansion (present only on platforms that surface them)",
                                    "properties": {
                                      "replies_token": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "YouTube reply continuation token: pass to `/v1/youtube/video/comment/replies?continuationToken=`"
                                      },
                                      "replies_cursor": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Reddit reply-branch continuation cursor. Present when this comment's reply tree is truncated upstream: pass it back as `?cursor=` on `/v1/reddit/post/comments` to load the rest of the branch."
                                      },
                                      "depth": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Reddit comment nesting depth as the source reports it: 0 on a top-level comment, 1 on a direct reply, and so on. Present when the thread arrived flat and was re-nested into `replies[]`, so you can verify that nesting independently."
                                      },
                                      "published_at_epoch": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Raw Unix epoch for `published_at` (present only when the upstream sent a numeric epoch that was normalised to the ISO 8601 string)."
                                      },
                                      "feedback_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Facebook comment feedback id: feeds `/v1/facebook/post/comment/replies`"
                                      },
                                      "expansion_token": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Facebook comment expansion/paginator token: feeds `/v1/facebook/post/comment/replies`"
                                      },
                                      "author_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The commenter's platform-native numeric user id, where the upstream exposes one."
                                      },
                                      "ip_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.ip_location"
                                      },
                                      "urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.urn"
                                      },
                                      "reaction_counts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at comment.ext.reaction_counts",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at comment.ext.reaction_counts"
                                        }
                                      },
                                      "is_edited": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at comment.ext.is_edited"
                                      },
                                      "previous_replies_token": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.previous_replies_token"
                                      },
                                      "author_headline": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.author_headline"
                                      },
                                      "updated_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.updated_at"
                                      },
                                      "author_channel_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.author_channel_id"
                                      },
                                      "author_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.author_url"
                                      },
                                      "viewer_rating": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.viewer_rating"
                                      },
                                      "text_original": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.text_original"
                                      },
                                      "preview_replies": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at comment.ext.preview_replies",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at comment.ext.preview_replies"
                                        }
                                      },
                                      "lookup": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at comment.ext.lookup"
                                      },
                                      "post_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_title"
                                      },
                                      "post_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_url"
                                      },
                                      "subreddit": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.subreddit"
                                      },
                                      "subreddit_subscribers": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at comment.ext.subreddit_subscribers"
                                      },
                                      "post_score": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at comment.ext.post_score"
                                      },
                                      "post_comment_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at comment.ext.post_comment_count"
                                      },
                                      "post_author": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_author"
                                      },
                                      "post_published_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_published_at"
                                      },
                                      "post_flair": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.post_flair"
                                      },
                                      "is_submitter": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at comment.ext.is_submitter"
                                      },
                                      "edited_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.edited_at"
                                      },
                                      "controversiality": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at comment.ext.controversiality"
                                      },
                                      "content_language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "ISO 639-1 language tag for this comment, when the source reports one. X writes `zxx` / `und` for no linguistic content; those collapse to null."
                                      },
                                      "author_followers": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The commenter's follower count as embedded in this row. Snapshot as of whenever the replies source saw the account, not a live figure. On X this is present on every `tweet/replies` row."
                                      },
                                      "author_following": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The commenter's following count as embedded in this row. Same snapshot caveat as `author_followers`."
                                      },
                                      "author_posts_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The commenter's post count as embedded in this row. Same snapshot caveat as `author_followers`."
                                      },
                                      "author_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at comment.ext.author_location"
                                      },
                                      "quote_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "How many quote-posts this comment has, when the source reports it. On X a reply is a tweet, so this is the same figure `post.ext.quote_count` carries on tweet lanes."
                                      },
                                      "views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "View count for this comment, when the source reports it. On X a reply is a tweet and the count is public on posts from ~2022 onward."
                                      },
                                      "saves": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Bookmark / save count for this comment, when the source reports it. On X this is `legacy.bookmark_count`."
                                      }
                                    }
                                  },
                                  "replies": {
                                    "type": [
                                      "array",
                                      "null"
                                    ],
                                    "description": "Nested reply tree: array of child comments, each itself a full Comment object with its own `replies`. Populated on threaded platforms (Reddit); absent on flat-comment platforms, which thread only via `parent_id`.",
                                    "items": {
                                      "type": "object",
                                      "description": "Nested reply tree: array of child comments, each itself a full Comment object with its own `replies`. Populated on threaded platforms (Reddit); absent on flat-comment platforms, which thread only via `parent_id`."
                                    }
                                  }
                                }
                              }
                            }
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "reddit",
                  "endpoint": "/v1/reddit/search/comments",
                  "data": {
                    "items": [
                      {
                        "comment": {
                          "id": "p8jlxam",
                          "url": "https://www.reddit.com/r/ProgrammerHumor/comments/1wangyc/comment/p8jlxam/",
                          "parent_id": null,
                          "post_id": "1wangyc",
                          "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                          "author": {
                            "username": "user_95c8d1",
                            "display_name": "user_d4d61e",
                            "avatar_url": "https://example.com/avatars/user_36cbc5.png",
                            "verified": null
                          },
                          "engagement": {
                            "likes": 174,
                            "replies": null
                          },
                          "flags": {
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2026-09-08T13:37:34.616Z",
                          "ext": {
                            "published_at_epoch": 1788874654,
                            "post_title": "theLastOReillyJustDropped",
                            "post_url": "https://www.reddit.com/r/ProgrammerHumor/comments/t3_1wangyc/",
                            "subreddit": "ProgrammerHumor",
                            "subreddit_subscribers": 4765922,
                            "post_score": 13632,
                            "post_comment_count": 284,
                            "post_author": "user_dfee63",
                            "post_published_at": "2026-09-08T12:47:34.490000+0000",
                            "post_flair": "Other",
                            "content_language": "und"
                          }
                        },
                        "computed": {
                          "language": "en"
                        }
                      },
                      {
                        "comment": {
                          "id": "p7ojstd",
                          "url": "https://www.reddit.com/r/europe/comments/1w6km5i/comment/p7ojstd/",
                          "parent_id": null,
                          "post_id": "1w6km5i",
                          "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                          "author": {
                            "username": "user_bf049a",
                            "display_name": "user_89ab7f",
                            "avatar_url": "https://example.com/avatars/user_1df840.png",
                            "verified": null
                          },
                          "engagement": {
                            "likes": 96,
                            "replies": null
                          },
                          "flags": {
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2026-09-03T23:55:35.758Z",
                          "ext": {
                            "published_at_epoch": 1788479735,
                            "post_title": "Volkswagen board approves turnaround plan, flags 50,000 possible job cuts across group",
                            "post_url": "https://www.reddit.com/r/europe/comments/t3_1w6km5i/",
                            "subreddit": "europe",
                            "subreddit_subscribers": 11667913,
                            "post_score": 911,
                            "post_comment_count": 271,
                            "post_author": "user_15cd0b",
                            "post_published_at": "2026-09-03T21:22:22.400000+0000",
                            "post_flair": "News",
                            "content_language": "en"
                          }
                        },
                        "computed": {
                          "language": "en"
                        }
                      }
                    ],
                    "next_cursor": "sc2.eyJzIjoicCIsImMiOiJNalE9In0",
                    "total": null,
                    "comment_recency": {
                      "policy_version": "d09-1",
                      "n": 24,
                      "counted": 24,
                      "abstained": 0,
                      "share_last_24h": 0,
                      "share_later_half": 0.2917,
                      "too_few": false,
                      "stage": "slowing",
                      "order": "default",
                      "recent_share_is_floor": true,
                      "receipts": []
                    },
                    "dropped": 0
                  },
                  "credits_used": 1,
                  "request_id": "req_example000000",
                  "cached": false,
                  "pagination": {
                    "next_cursor": "sc.eyJ2IjoyLCJjIjoic2MyLmV5SnpJam9pY0NJc0ltTWlPaUpOYWxFOUluMCIsImUiOiJyZWRkaXQvc2VhcmNoL2NvbW1lbnRzIiwicCI6ImN1cnNvciJ9",
                    "has_more": true,
                    "page_size": 24
                  },
                  "credits_remaining": 9999,
                  "source": "captured",
                  "captured_at": "2026-10-02T15:39:28.516Z",
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/reddit/subreddits/search": {
      "get": {
        "summary": "Find subreddits by topic",
        "description": "Finds communities by topic. Every other Reddit endpoint on this API needs you to already know the subreddit you want; this is the one that answers which communities discuss a subject. Returns up to 25 communities with the name, the subscriber count, the description, the icon, the NSFW flag and the community URL. `author.id` is the bare community name in Reddit's own casing, which is exactly what `/v1/reddit/subreddit`, `/v1/reddit/subreddit/details` and `/v1/reddit/subreddit/search` take as their `subreddit` parameter, so a discovery call feeds a listing call with no re-mapping in between. The row is the same Author shape `/v1/reddit/subreddit/details` returns. The search surface publishes nothing else, so on a plain call `author.joined_at`, `author.ext.weekly_active_users`, `author.ext.weekly_contributions`, `author.ext.rules_text` and `author.ext.language` are null on every row. Send `include=details` and every row is joined, in the same call, to the details lookup that carries them: the community's creation date, weekly active users, weekly contributions and rules land on each row (rules stay null for a community that publishes none), and the language on most rows (it comes from a second source that can miss a row on a busy page, so treat it as usually present). When the details lookup's main source cannot answer a row, its second source still fills the creation date and the language and that row is billed as filled, but the weekly numbers and the rules stay null on it; `data.hydration` counts it among the filled rows. Cost: 1 credit for the page plus 1 credit per row filled from a fresh lookup (25 rows, so 26 at most); rows already in cache are filled for free, rows that could not be filled are refunded, and a repeat of the same call within the cache window is 0. Time: a plain call is about 1 second; `include=details` adds 3 to 9 seconds on a fresh page (the lookups run in parallel and the call waits for the slowest, never more than 12 seconds) and nothing when the rows are already cached. `limit=N` (1 to 25) takes the top N communities of the page and, with `include`, caps the extra credits at N. The response carries a `hydration` block itemising rows, lookups, cache hits, credits and milliseconds. The subscriber count on a search row is the search index's own figure; the join never overwrites a value the row already carries. Note the name: this is `subreddits/search` and it finds COMMUNITIES, where the singular `subreddit/search` searches posts INSIDE one community. Paginate with `cursor`. When the main source is unavailable, a backup answers the first page with the same fields and no `cursor`. A query that matches nothing still returns communities rather than an empty list, which is Reddit's own search behaviour, so judge relevance on the rows.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_subreddits_search",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 1,
        "x-credit-cost-min": 1,
        "x-credit-cost-max": 26,
        "x-credit-cost-formula": "1 credit for the page. include=details holds 1 credit per row, at most 25 (or `limit`), and keeps only the rows filled from a fresh lookup, so a page is at most 26 credits; rows served from cache are free, unfilled rows are refunded, and a repeat within the cache window costs 0. With `max_pages`, `max_items` or `max_credits`, each page walked is billed at this price (a cached page is free), and `max_credits` caps the total.",
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Topic or keyword to find communities for.",
            "schema": {
              "type": "string"
            },
            "example": "machine learning"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Cursor to get more results. Get 'cursor' from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "description": "Set to `details` (one token only) to fill `author.joined_at`, `author.ext.weekly_active_users`, `author.ext.weekly_contributions`, `author.ext.rules_text` and `author.ext.language` on every row in this one call (a row the details lookup's main source cannot answer gets only the creation date and the language, and is still billed). Holds 1 credit per row (at most 25, or `limit`) and keeps only the rows filled from a fresh lookup; rows already in cache and rows that could not be filled are refunded, so the most a call can cost is 1 + rows. Adds 3 to 9 seconds on a fresh page (never more than 12) and nothing when the rows are already cached; read `data.hydration` for the rows, the credits held and kept, and the time.",
            "schema": {
              "type": "string",
              "enum": [
                "details"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Take the top N communities of the page (1 to 25). With `include=details` it also caps the extra credits at N, so `limit=5&include=details` holds 6 credits, not 26. It is not a page size: the cursor still advances past the whole page, so rows beyond N are not returned by the next page.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 25
            }
          },
          {
            "name": "max_pages",
            "in": "query",
            "required": false,
            "description": "1 to 50 (default 1, or 50 when `max_items` or `max_credits` is sent). Walk up to this many pages in one call and return the rows from all of them. Each page walked is billed exactly as one call to this endpoint (a cached page is free) and counts against your rate limit; its charge and any refund are recorded under the page's own request id, listed in `data.walk.request_ids`. The walk stops early at the last page, or when the request's time budget runs low; `data.walk.stopped` says why (`end`, `max_pages`, `max_items`, `max_credits`, `time_budget`, `page_error`) and `pagination.next_cursor` continues from where it stopped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "max_items",
            "in": "query",
            "required": false,
            "description": "1 to 5000. Get more in one call: keep walking pages until the response holds at least this many rows, then stop with `data.walk.stopped: \"max_items\"`. The last page is returned whole (it was billed), so `data.items` can hold up to one page more than this, and `pagination.next_cursor` resumes right after it without skipping a row. Walks up to 50 pages unless `max_pages` says fewer; each page is billed as one call (a cached page is free). Add `max_credits` to cap the spend. A long walk can stop on the time budget first (`\"time_budget\"`): send the returned cursor with the same params to continue.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "max_credits",
            "in": "query",
            "required": false,
            "description": "1 to 100000. The most this call may spend, across every page it walks. A page starts only while the credits already spent plus that page's price (or, when higher, the most any page of this walk has cost) still fit, so the call never goes past it; the walk then stops with `data.walk.stopped: \"max_credits\"` and the cursor to resume. Sent alone, it walks as far as the budget goes (up to 50 pages). A value below the price of one page is a free 400 whose `error.details.page_credits` names that price. Credits a row join (`include=`) adds are known only once a page has run, so page 1 is checked against its own price.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/subreddits/search"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of canonical author wrappers ({ author })",
                          "items": {
                            "type": "object",
                            "description": "Canonical author wrapper",
                            "properties": {
                              "author": {
                                "type": "object",
                                "description": "Canonical Author object (unified across all platforms)",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "Platform-specific user ID (always a string; platform-specific prefixes like `did:`, `spotify:artist:`, `t2_` are stripped)"
                                  },
                                  "username": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "User handle or username"
                                  },
                                  "display_name": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Display name or full name"
                                  },
                                  "avatar_url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "URL to profile picture"
                                  },
                                  "bio": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Profile biography or description"
                                  },
                                  "verified": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Whether the account is verified"
                                  },
                                  "followers": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Follower or subscriber count as an integer. Exact on Instagram and on TikTok when the source exposes an unrounded figure. YouTube above 1,000 subscribers is YouTube's published three-significant-figure figure. When the integer is a published/rounded value, `author.ext.followers_approximate` is true."
                                  },
                                  "following": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Number of accounts followed"
                                  },
                                  "posts_count": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Total number of posts / videos / tracks / episodes"
                                  },
                                  "likes_count": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Total likes received across the author's content (when surfaced)"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Direct URL to the profile page"
                                  },
                                  "location": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "ISO region code (e.g. `US`) or freeform location string when surfaced"
                                  },
                                  "external_url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Bio link / external website URL when surfaced by the platform"
                                  },
                                  "private": {
                                    "type": [
                                      "boolean",
                                      "null"
                                    ],
                                    "description": "Boolean at author.private"
                                  },
                                  "joined_at": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at author.joined_at"
                                  },
                                  "last_post_at": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "String at author.last_post_at"
                                  },
                                  "ext": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Nested object: author.ext",
                                    "properties": {
                                      "social_context": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.social_context"
                                      },
                                      "account_created": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.account_created"
                                      },
                                      "country": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.country"
                                      },
                                      "country_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.country_name"
                                      },
                                      "collects_received": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.collects_received"
                                      },
                                      "former_usernames": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at author.ext.former_usernames",
                                        "items": {
                                          "type": "string",
                                          "description": "String at author.ext.former_usernames"
                                        }
                                      },
                                      "former_usernames_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram profile/about: how many former usernames Instagram's \"About this account\" panel lists for the account. 0 when the panel lists none, null when the panel could not be read on this call (the response then carries a note saying so). A count above 0 means the handle was renamed at least once; the names themselves are not published."
                                      },
                                      "verified_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Instagram profile/about, opt-in (`include=verified_at`): the month Instagram verified the account, as the panel shows it (\"April 2024\"). A month, not a date. Null when the account is not verified or the panel shows no verification date. Absent unless requested."
                                      },
                                      "public_email": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.public_email"
                                      },
                                      "contact_email": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Opt-in (`contact_email=1` on instagram/profile, youtube/channel and youtube/channel/about). When the bio lists two or more email addresses, the one the creator gives for contacting them personally, copied verbatim. Null when there is one address or none, when every address belongs to a manager, agency or brand, or when the choice was not confident. `author.ext.public_email` (the first address in the bio) is unchanged."
                                      },
                                      "public_phone": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.public_phone"
                                      },
                                      "similar_source": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.similar_source"
                                      },
                                      "instagram_username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.instagram_username"
                                      },
                                      "similar_via": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.similar_via"
                                      },
                                      "business_category": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.business_category"
                                      },
                                      "bio_links": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at author.ext.bio_links",
                                        "items": {
                                          "type": "object",
                                          "description": "Nested object: author.ext.bio_links",
                                          "properties": {
                                            "title": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at author.ext.bio_links.title"
                                            },
                                            "url": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at author.ext.bio_links.url"
                                            },
                                            "link_type": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at author.ext.bio_links.link_type"
                                            }
                                          }
                                        }
                                      },
                                      "is_business": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.is_business"
                                      },
                                      "is_professional": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.is_professional"
                                      },
                                      "creator_marketplace": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.creator_marketplace"
                                      },
                                      "verification_label": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.verification_label"
                                      },
                                      "fbid": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.fbid"
                                      },
                                      "hd_avatar_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.hd_avatar_url"
                                      },
                                      "website": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.website"
                                      },
                                      "cover_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.cover_url"
                                      },
                                      "page_active": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.page_active"
                                      },
                                      "employee_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.employee_count"
                                      },
                                      "employee_count_range": {
                                        "type": [
                                          "object",
                                          "null"
                                        ],
                                        "description": "Nested object: author.ext.employee_count_range",
                                        "properties": {
                                          "start": {
                                            "type": [
                                              "integer",
                                              "null"
                                            ],
                                            "description": "Numeric at author.ext.employee_count_range.start"
                                          },
                                          "end": {
                                            "type": [
                                              "integer",
                                              "null"
                                            ],
                                            "description": "Numeric at author.ext.employee_count_range.end"
                                          }
                                        }
                                      },
                                      "founded_year": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.founded_year"
                                      },
                                      "company_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.company_type"
                                      },
                                      "tagline": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.tagline"
                                      },
                                      "specialities": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at author.ext.specialities",
                                        "items": {
                                          "type": "string",
                                          "description": "String at author.ext.specialities"
                                        }
                                      },
                                      "industries": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at author.ext.industries",
                                        "items": {
                                          "type": "string",
                                          "description": "String at author.ext.industries"
                                        }
                                      },
                                      "headquarters": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at author.ext.headquarters"
                                      },
                                      "locations": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at author.ext.locations",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at author.ext.locations"
                                        }
                                      },
                                      "hashtags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at author.ext.hashtags",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at author.ext.hashtags"
                                        }
                                      },
                                      "funding": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at author.ext.funding"
                                      },
                                      "address": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.address"
                                      },
                                      "price_range": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.price_range"
                                      },
                                      "rating": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.rating"
                                      },
                                      "rating_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.rating_count"
                                      },
                                      "talking_about_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.talking_about_count"
                                      },
                                      "business_hours": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at author.ext.business_hours",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at author.ext.business_hours"
                                        }
                                      },
                                      "links": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at author.ext.links",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at author.ext.links"
                                        }
                                      },
                                      "ad_library_page_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.ad_library_page_id"
                                      },
                                      "ad_library_status": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.ad_library_status"
                                      },
                                      "urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.urn"
                                      },
                                      "is_top_voice": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.is_top_voice"
                                      },
                                      "is_premium": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.is_premium"
                                      },
                                      "is_creator": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.is_creator"
                                      },
                                      "is_influencer": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.is_influencer"
                                      },
                                      "is_open_to_work": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.is_open_to_work"
                                      },
                                      "is_hiring": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.is_hiring"
                                      },
                                      "member_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.member_id"
                                      },
                                      "company_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.company_id"
                                      },
                                      "reaction_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.reaction_type"
                                      },
                                      "followers_approximate": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "True when `author.followers` is a published or rounded figure rather than an unrounded census: LinkedIn people-list display buckets, TikTok `stats.followerCount` when the exact sibling is absent, and YouTube subscriber counts at or above 1,000. Null or absent on exact counts."
                                      },
                                      "counts_source": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok profile only. Which of TikTok's two live counter sets `author.followers`, `author.following`, `author.likes_count` and `author.posts_count` carry: `app` (TikTok's app counters, the default) or `web` (the website's `statsV2`, returned with `counts=web`). The two sets can differ by a few percent in either direction."
                                      },
                                      "keywords": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.keywords"
                                      },
                                      "total_views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.total_views"
                                      },
                                      "joined_at_timestamp": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.joined_at_timestamp"
                                      },
                                      "topicCategories": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at author.ext.topicCategories",
                                        "items": {
                                          "type": "string",
                                          "description": "String at author.ext.topicCategories"
                                        }
                                      },
                                      "bannerExternalUrl": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.bannerExternalUrl"
                                      },
                                      "madeForKids": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.madeForKids"
                                      },
                                      "hiddenSubscriberCount": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.hiddenSubscriberCount"
                                      },
                                      "related_playlists": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at author.ext.related_playlists"
                                      },
                                      "topic_ids": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at author.ext.topic_ids",
                                        "items": {
                                          "type": "string",
                                          "description": "String at author.ext.topic_ids"
                                        }
                                      },
                                      "unsubscribed_trailer": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.unsubscribed_trailer"
                                      },
                                      "localizations": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at author.ext.localizations"
                                      },
                                      "monthly_listeners": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.monthly_listeners"
                                      },
                                      "total_ratings": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Spotify podcasts only: how many listeners have rated the show. Cumulative over the show's whole run, so it reflects longevity as well as size, and it is NOT an audience count (Spotify publishes no play, download, subscriber or follower count for a podcast)"
                                      },
                                      "average_rating": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Spotify podcasts only: mean listener rating from 0 to 5. Fractional (e.g. 4.66) despite the integer type this schema emits for every numeric leaf"
                                      },
                                      "creator_username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.creator_username"
                                      },
                                      "join_policy": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.join_policy"
                                      },
                                      "is_nsfw": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.is_nsfw"
                                      },
                                      "rules": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at author.ext.rules",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at author.ext.rules"
                                        }
                                      },
                                      "weekly_active_users": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.weekly_active_users"
                                      },
                                      "weekly_contributions": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.weekly_contributions"
                                      },
                                      "rules_text": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.rules_text"
                                      },
                                      "language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.language"
                                      },
                                      "post_karma": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.post_karma"
                                      },
                                      "comment_karma": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.comment_karma"
                                      },
                                      "awardee_karma": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.awardee_karma"
                                      },
                                      "trophy_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.trophy_count"
                                      },
                                      "banner_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.banner_url"
                                      },
                                      "profile_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.profile_title"
                                      },
                                      "social_links": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at author.ext.social_links",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at author.ext.social_links"
                                        }
                                      },
                                      "bio_link": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.bio_link"
                                      },
                                      "embed_html": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.embed_html"
                                      },
                                      "embed_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.embed_url"
                                      },
                                      "group": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at author.ext.group"
                                      },
                                      "search_hit": {
                                        "type": [
                                          "object",
                                          "null"
                                        ],
                                        "description": "Nested object: author.ext.search_hit",
                                        "properties": {
                                          "match": {
                                            "type": [
                                              "string",
                                              "null"
                                            ],
                                            "description": "Leaf at author.ext.search_hit.match"
                                          },
                                          "title": {
                                            "type": [
                                              "string",
                                              "null"
                                            ],
                                            "description": "String at author.ext.search_hit.title"
                                          },
                                          "snippet": {
                                            "type": [
                                              "string",
                                              "null"
                                            ],
                                            "description": "String at author.ext.search_hit.snippet"
                                          },
                                          "evidence_url": {
                                            "type": [
                                              "string",
                                              "null"
                                            ],
                                            "description": "String at author.ext.search_hit.evidence_url"
                                          },
                                          "matched_urls": {
                                            "type": [
                                              "array",
                                              "null"
                                            ],
                                            "description": "Array at author.ext.search_hit.matched_urls",
                                            "items": {
                                              "type": "string",
                                              "description": "String at author.ext.search_hit.matched_urls"
                                            }
                                          }
                                        }
                                      },
                                      "blog_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.blog_name"
                                      },
                                      "blog_no": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.blog_no"
                                      },
                                      "visitors_today": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.visitors_today"
                                      },
                                      "visitors_total": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at author.ext.visitors_total"
                                      },
                                      "topic": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at author.ext.topic"
                                      },
                                      "power_blog": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.power_blog"
                                      },
                                      "official_blog": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at author.ext.official_blog"
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "reddit",
                  "endpoint": "/v1/reddit/subreddits/search",
                  "data": {
                    "items": [
                      {
                        "author": {
                          "id": "user_0b2f67",
                          "username": "user_0b2f67",
                          "display_name": "user_0b2f67",
                          "avatar_url": "https://example.com/avatars/user_37b18d.png",
                          "bio": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                          "verified": null,
                          "followers": 3075004,
                          "following": null,
                          "posts_count": null,
                          "likes_count": null,
                          "url": "https://example.com/user_05e113",
                          "private": null,
                          "joined_at": null,
                          "ext": {
                            "is_nsfw": false,
                            "weekly_active_users": null,
                            "weekly_contributions": null,
                            "rules_text": null,
                            "language": null
                          }
                        }
                      },
                      {
                        "author": {
                          "id": "user_21b48e",
                          "username": "user_21b48e",
                          "display_name": "user_21b48e",
                          "avatar_url": null,
                          "bio": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                          "verified": null,
                          "followers": 682525,
                          "following": null,
                          "posts_count": null,
                          "likes_count": null,
                          "url": "https://example.com/user_5311fd",
                          "private": null,
                          "joined_at": null,
                          "ext": {
                            "is_nsfw": false,
                            "weekly_active_users": null,
                            "weekly_contributions": null,
                            "rules_text": null,
                            "language": null
                          }
                        }
                      }
                    ],
                    "next_cursor": "sc1.eyJjIjoiTWpRPSIsInMiOltdfQ",
                    "total": null,
                    "dropped": 0
                  },
                  "credits_used": 1,
                  "request_id": "req_example000000",
                  "cached": false,
                  "pagination": {
                    "next_cursor": "sc.eyJ2IjoyLCJjIjoic2MxLmV5SmpJam9pVFdwUlBTSXNJbk1pT2x0ZGZRIiwiZSI6InJlZGRpdC9zdWJyZWRkaXRzL3NlYXJjaCIsInAiOiJjdXJzb3IifQ",
                    "has_more": true,
                    "page_size": 2
                  },
                  "credits_remaining": 9999,
                  "source": "captured",
                  "captured_at": "2026-10-02T07:33:19.717Z",
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/reddit/search/media": {
      "get": {
        "summary": "Search Reddit image and video posts",
        "description": "Searches Reddit's media-scoped index: the posts a keyword search would return, filtered to those that actually carry an image, a video or a gallery. Use it when you want visual content for a topic and do not want to filter a mixed page yourself. Up to 25 posts per page, each with the title, the score, the comment count, the subreddit, the upvote ratio, the flair, the author avatar, the thumbnail and the media at `content.media_urls` — an array on a gallery post and a single-element array otherwise. Reddit's operators work in `query` here too, so `subreddit:name terms` scopes the sweep to one community. `timeframe` applies on `sort=relevance`, `sort=top` and `sort=comment_count`; it has no effect on `sort=new`, which is already newest-first. Paginate with `cursor`. When the main source is down, a backup serves the first page and offers a `cursor` on `sort=top` only, for one more page of 25; on other sorts that page carries no `cursor`. A query that matches nothing still returns loosely-related media posts rather than an empty list, which is Reddit's own search behaviour.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_search_media",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 1,
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Search phrase. Reddit's operators work here: `subreddit:name terms` scopes the sweep to one community, and quotes force an exact phrase.",
            "schema": {
              "type": "string"
            },
            "example": "mechanical keyboard build"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Sort by",
            "schema": {
              "type": "string",
              "enum": [
                "relevance",
                "new",
                "top",
                "comment_count"
              ]
            }
          },
          {
            "name": "timeframe",
            "in": "query",
            "required": false,
            "description": "Only return posts from this window. Applied on sort=relevance, sort=top and sort=comment_count. It has no effect with sort=new, which is already ordered newest-first.",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "day",
                "week",
                "month",
                "year"
              ]
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Cursor to get more results. Get 'cursor' from the previous response.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Only rows published on or after this date: YYYY-MM-DD (midnight UTC) or an ISO 8601 timestamp. Rows older than it are left off each page. This list is not in date order, so the walk does not stop at the date: keep following `next_cursor`, and each page costs what a page costs even when every row on it is filtered out. A row with no date is kept. `published_after`, `start_date`, `from_date`, `publish_time` (`yesterday`, `this-week`, `this-month`, `last-3-months`, `last-6-months`) and `max_age_days` are accepted and applied as `since`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "until",
            "in": "query",
            "required": false,
            "description": "Only rows published on or before this date: YYYY-MM-DD (that whole UTC day is included) or an ISO 8601 timestamp. Newer rows are left off each page and the walk does not stop, so older pages follow. A row with no date is kept. `published_before`, `end_date` and `to_date` are accepted and applied as `until`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "max_pages",
            "in": "query",
            "required": false,
            "description": "1 to 50 (default 1, or 50 when `max_items` or `max_credits` is sent). Walk up to this many pages in one call and return the rows from all of them. Each page walked is billed exactly as one call to this endpoint (a cached page is free) and counts against your rate limit; its charge and any refund are recorded under the page's own request id, listed in `data.walk.request_ids`. The walk stops early at the last page, or when the request's time budget runs low; `data.walk.stopped` says why (`end`, `max_pages`, `max_items`, `max_credits`, `time_budget`, `page_error`) and `pagination.next_cursor` continues from where it stopped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "max_items",
            "in": "query",
            "required": false,
            "description": "1 to 5000. Get more in one call: keep walking pages until the response holds at least this many rows, then stop with `data.walk.stopped: \"max_items\"`. The last page is returned whole (it was billed), so `data.items` can hold up to one page more than this, and `pagination.next_cursor` resumes right after it without skipping a row. Walks up to 50 pages unless `max_pages` says fewer; each page is billed as one call (a cached page is free). Add `max_credits` to cap the spend. A long walk can stop on the time budget first (`\"time_budget\"`): send the returned cursor with the same params to continue.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000
            }
          },
          {
            "name": "max_credits",
            "in": "query",
            "required": false,
            "description": "1 to 100000. The most this call may spend, across every page it walks. A page starts only while the credits already spent plus that page's price (or, when higher, the most any page of this walk has cost) still fit, so the call never goes past it; the walk then stops with `data.walk.stopped: \"max_credits\"` and the cursor to resume. Sent alone, it walks as far as the budget goes (up to 50 pages). A value below the price of one page is a free 400 whose `error.details.page_credits` names that price. Credits a row join (`include=`) adds are known only once a page has run, so page 1 is checked against its own price.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/search/media"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "items": {
                          "type": "array",
                          "description": "Array of canonical post wrappers ({ post, computed })",
                          "items": {
                            "type": "object",
                            "description": "Canonical post wrapper",
                            "properties": {
                              "post": {
                                "type": "object",
                                "description": "Canonical Post object (unified across all platforms)",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "description": "Platform-specific post ID (always a string; numeric upstream IDs are stringified)"
                                  },
                                  "url": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Direct URL to the post on the source platform"
                                  },
                                  "content": {
                                    "type": "object",
                                    "description": "Post content fields (text, media, thumbnail, duration)",
                                    "properties": {
                                      "text": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Post caption, description, or text content"
                                      },
                                      "media_urls": {
                                        "type": [
                                          "string",
                                          "array",
                                          "null"
                                        ],
                                        "description": "URL(s) of the primary media. Single string for video/photo posts; array of strings for carousels.",
                                        "items": {
                                          "type": "string",
                                          "description": "URL(s) of the primary media. Single string for video/photo posts; array of strings for carousels."
                                        }
                                      },
                                      "thumbnail_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "URL to thumbnail image"
                                      },
                                      "duration_seconds": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Video/clip duration in seconds (null for non-video posts)"
                                      }
                                    }
                                  },
                                  "author": {
                                    "type": "object",
                                    "description": "Subset of Author fields for the post creator",
                                    "properties": {
                                      "username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Author username"
                                      },
                                      "display_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Author display name"
                                      },
                                      "avatar_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "URL to author profile picture"
                                      },
                                      "verified": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Whether the author account is verified"
                                      }
                                    }
                                  },
                                  "engagement": {
                                    "type": "object",
                                    "description": "Engagement counts",
                                    "properties": {
                                      "views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "View count (if available). For Instagram video/reels this is the play count: the headline 'Views' the IG app shows. Instagram removed per-post play counts from its public web pages in August 2026, so `GET /v1/instagram/post` now fills the count automatically from a second source within the same call: videos and reels keep a numeric `views` with no extra endpoint or workaround. Note: since mid-July 2026 Instagram's play count is Instagram-only. It no longer includes Facebook crosspost views (Meta-side change; the app UI changed identically). For combined reach, also fetch the Facebook crosspost via `/v1/facebook/post`."
                                      },
                                      "likes": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Like / reaction count"
                                      },
                                      "comments": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Comment count. Note: on `GET /v1/instagram/post` this is Instagram's `edge_media_to_parent_comment.count` (top-level comments); the IG list endpoints report the mobile `comment_count` total (includes replies). Both land on this same field."
                                      },
                                      "shares": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Share / repost / retweet count. On Instagram this is `reshare_count` (the paper-plane Share / Send count) and it exists only on Instagram's mobile surface, so it is returned by `/v1/instagram/post/stats`, `/v1/instagram/profile/reels/full`, and `/v1/instagram/profile/posts/full`. The web-sourced Instagram list and search endpoints return `null` (never fabricated)."
                                      },
                                      "saves": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Save / bookmark count. `null` on Instagram: the save count is platform-private and Instagram exposes no numeric save metric on any surface (never fabricated)."
                                      }
                                    }
                                  },
                                  "flags": {
                                    "type": "object",
                                    "description": "Boolean flags on the post",
                                    "properties": {
                                      "nsfw": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "NSFW flag (null when platform does not surface)"
                                      },
                                      "spoiler": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Spoiler flag (null when platform does not surface)"
                                      },
                                      "pinned": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Pinned-to-profile flag (null when platform does not surface)"
                                      },
                                      "deleted": {
                                        "type": "boolean",
                                        "description": "Whether the post is tombstoned (always present)"
                                      },
                                      "likes_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Present and `true` when the creator has hidden the like count. `engagement.likes` is `null` in that case (never the platform's decoy preview number). Absent on normal posts."
                                      },
                                      "comments_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Present and `true` when the upstream reports the comment count as hidden. `engagement.comments` is `null` in that case. Absent on normal posts."
                                      },
                                      "shares_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.shares_hidden"
                                      },
                                      "views_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.views_hidden"
                                      },
                                      "saves_hidden": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.flags.saves_hidden"
                                      }
                                    }
                                  },
                                  "published_at": {
                                    "type": [
                                      "string",
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Post creation timestamp as an ISO 8601 UTC string. When the upstream sent a Unix epoch it is converted here and the raw epoch is preserved under `post.ext.published_at_epoch` for one deprecation cycle."
                                  },
                                  "ext": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Platform-specific passthrough fields for cross-endpoint chains (present only on platforms that surface them)",
                                    "properties": {
                                      "music_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok music/clip id (exact string): pass to `/v1/tiktok/song/videos?clipId=` to find videos using the same sound"
                                      },
                                      "matched_song_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The catalogue song TikTok matched the video's sound to, as an exact digit string. An official clip and the original sounds creators upload with it have different `music_id` values and the same `matched_song_id`, so group rows on it to count every use of one song. It is not a clipId: `/v1/tiktok/song` and `/v1/tiktok/song/videos` do not accept it. `/v1/tiktok/search/music` carries it on each sound, so a search on the song's title and artist, kept to the sounds with the same `matched_song_id`, gives the song's official sounds and their `video_count`. Absent when TikTok matched the sound to no song, and on rows served from a source that does not report the match."
                                      },
                                      "matched_song_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The title of the song in `matched_song_id`. Absent when there is no matched song."
                                      },
                                      "matched_song_artist": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The artist of the song in `matched_song_id`, as TikTok's catalogue names it. Absent when there is no matched song."
                                      },
                                      "music_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The title of the video's own sound (`music_id`). An uploaded sound is titled like `original sound - <handle>`; the song it plays, when TikTok recognised one, is `matched_song_title`."
                                      },
                                      "music_artist": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only. The artist TikTok shows for the video's own sound. On an original sound this is the uploader's display name, not the song's artist; use `matched_song_artist` for that."
                                      },
                                      "music_is_original": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "TikTok only. `true` when the video's sound is an original sound a creator uploaded, `false` when it is a catalogue track. Absent when the source does not say."
                                      },
                                      "author_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The creator's platform-native numeric user id. On TikTok search and list items, pass to `/v1/tiktok/profile?user_id=` for the creator's current follower count (survives username changes). On Instagram `/v1/instagram/search/reels`, `/v1/instagram/search/hashtag` and `/v1/instagram/location/posts` items it is present on every row, accepted by `/v1/instagram/profile/country?user_id=` and `/v1/instagram/basic-profile?userId=`. On Facebook it appears when the upstream exposed a numeric actor id and no real handle."
                                      },
                                      "author_url": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The posting account's profile URL, so a matching post can be followed to its account. Present on `/v1/facebook/search/posts` rows: the vanity or `/people/<name>/<id>/` URL when Facebook sends one, otherwise `https://www.facebook.com/profile.php?id=<numeric id>` built from the account id. Pass it as `url` to `/v1/facebook/profile` (or to `/v1/prism/profiles` with `platform: facebook`). Null when the row names neither an account URL nor a numeric account id. Absent on other endpoints."
                                      },
                                      "author_followers": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "The creator's follower count as embedded in the search payload itself, when the search source happens to carry one. On Instagram `search/reels` it is null on a plain call, because Instagram stopped sending follower counts in its search payload in August 2026; send `include=creator` (or `country`) and it is filled from the creator's profile, 2 credits per creator looked up. It stays null when that lookup does not resolve."
                                      },
                                      "author_following": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.author_following"
                                      },
                                      "author_posts_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.author_posts_count"
                                      },
                                      "author_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The free text the author wrote in their profile's location field, exactly as written (for example `Johannesburg, South Africa`). It is not a country code and is not checked. Present on X tweet and reply rows; null or absent when the author left it blank."
                                      },
                                      "in_reply_to_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.in_reply_to_id"
                                      },
                                      "in_reply_to_username": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.in_reply_to_username"
                                      },
                                      "conversation_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.conversation_id"
                                      },
                                      "author_country": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The creator's country. On Instagram it is the country the creator declares on the About this account panel, as a country name (for example `Spain`), and it is not where the post was filmed. It is present on `/v1/instagram/search/reels` when the request sends `include=creator`, `include=country` or `country`, and on `/v1/instagram/search/hashtag` and `/v1/instagram/location/posts` when it sends `include=country`, filled by looking the creator up. On YouTube rows joined with `include=channel` it is the channel's own country as an ISO 3166-1 alpha-2 code (for example `ZA`). Null when the platform publishes no country for the creator or the lookup did not resolve, and nothing is guessed; absent on a plain call."
                                      },
                                      "author_public_email": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The public contact email on the creator's profile. Present only on `/v1/instagram/search/reels` when the request sends `include=creator`, filled by looking the creator up. Null when the creator lists no public email or the lookup did not resolve; absent on a plain call."
                                      },
                                      "author_public_phone": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The public contact phone number on the creator's profile. Present only on `/v1/instagram/search/reels` when the request sends `include=creator`, filled by looking the creator up. Null when the creator lists no public phone or the lookup did not resolve; absent on a plain call."
                                      },
                                      "download_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "How many times the video has been saved to a device. TikTok only, and distinct from `engagement.saves`: a save keeps the video in a private collection on the platform, a download takes a copy off it, and TikTok counts the two separately. Present on TikTok post, search and post-list responses; absent everywhere else."
                                      },
                                      "region": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "TikTok only: the country TikTok registers the video to, as an ISO 3166-1 alpha-2 code (normally the creator's account country when they posted). It is not the viewer's country, not the `region` you requested, and not a language. On `/v1/tiktok/trending`, `/v1/tiktok/search`, `/v1/tiktok/search/top`, `/v1/tiktok/profile/videos`, `/v1/tiktok/search/hashtag` and `/v1/tiktok/song/videos` it is how you tell which rows are from a given country: filter on it when you need only that country. A row whose source omits the country stays null. The `region` request parameter still only sets the proxy."
                                      },
                                      "subreddit": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Reddit subreddit name (search/list items): pass to `/v1/reddit/subreddit/details?subreddit=`"
                                      },
                                      "title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.title"
                                      },
                                      "selftext": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.selftext"
                                      },
                                      "upvote_ratio": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Reddit only: the share of a post's votes that are upvotes, as a fraction from 0 to 1 and usually close to 1 (six live rows measured 1, 1, 1, 0.86, 0.75, 1). Fractional despite the integer type this schema emits for every numeric leaf, the same caveat as `author.ext.average_rating`. Populated on `/v1/reddit/search` rows whose source carries it, and null everywhere else on Reddit including `/v1/reddit/post` and `/v1/reddit/subreddit`."
                                      },
                                      "flair": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.flair"
                                      },
                                      "content_language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "The language the platform itself tags the post with, when it sends one: Reddit's own language tag on Reddit lanes, and TikTok's caption-language tag (for example `de`) on `/v1/tiktok/trending?feed=local`. Null when the platform could not tell (Reddit `und`, TikTok `un`, common on short or emoji-only captions); absent where the source sends no tag. Never inferred from the text by us: that is `post.computed.language`."
                                      },
                                      "type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.type"
                                      },
                                      "content_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.content_type"
                                      },
                                      "ticker_symbols": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.ticker_symbols",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.ticker_symbols"
                                        }
                                      },
                                      "video_view_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram's legacy 3-second-view count. Historical: Instagram stopped serving it in August 2026 (removed from its web post surface along with the web play count), so fresh `/v1/instagram/post` lookups no longer carry it and no source can restore it. Use `engagement.views` (the play count) instead."
                                      },
                                      "ig_play_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram-only play count (`ig_play_count`). Since mid-July 2026 Instagram's headline play count (`engagement.views`) no longer includes Facebook crosspost views and equals this value; it is surfaced explicitly so you can tell the Instagram-only figure apart and detect any future re-divergence. For combined Instagram + Facebook reach, also fetch the Facebook crosspost via `/v1/facebook/post`. Present on `/v1/instagram/post/stats` and, since the August 2026 views fix, on `/v1/instagram/post` for video posts."
                                      },
                                      "repost_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.repost_count"
                                      },
                                      "media_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.media_type"
                                      },
                                      "text_truncated": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.text_truncated"
                                      },
                                      "ip_location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.ip_location"
                                      },
                                      "carousel_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.carousel_count"
                                      },
                                      "remix_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.remix_count"
                                      },
                                      "audio_cluster_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Instagram's audio cluster for a reel, as an exact digit string: the id Instagram uses to group different uploads of the same sound. Present on `/v1/instagram/audio/reels` rows and on `/v1/instagram/profile/reels` with `include=stats`; absent on a row when it is not available and on every other surface."
                                      },
                                      "facebook_likes": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post share that was EXCLUDED from `engagement.likes` on this row. A post shared to Facebook arrives from some sources with its Facebook likes already folded into the Instagram count, so the share is subtracted and published here, which keeps `engagement.likes` the Instagram-only figure instagram.com shows on the post. Add the two together for the combined number. Absent when the read carried no Facebook share, and absent on a post whose owner hides the like count, because nothing can be subtracted from a null. A response that excluded a share also carries a note in `data._warnings`."
                                      },
                                      "facebook_comments": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post share that was EXCLUDED from `engagement.comments` on this row, the comment counterpart of `post.ext.facebook_likes`. Each leaf appears only for the count it actually changed, so a post whose likes are hidden but whose comments were reconciled carries this one alone."
                                      },
                                      "instagram_views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Instagram-only play count of a video, the same figure on every Instagram endpoint. `engagement.views` keeps each endpoint's established meaning: on `/v1/instagram/profile/reels`, `/v1/instagram/audio/reels`, `/v1/instagram/search/reels` and `/v1/instagram/search/hashtag` it can include the post's Facebook cross-post views, while on `/v1/instagram/post` and `/v1/instagram/post/stats` it is Instagram-only. Read this leaf when you compare one post across endpoints. Absent on photos and when the source did not report the Instagram-only figure."
                                      },
                                      "facebook_views": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Instagram only: the Facebook cross-post part of a video's play count, the counterpart of `post.ext.instagram_views`. Present only when the source reported the Facebook part, or a combined total above the Instagram figure. Absent does not mean zero: some sources report the Instagram figure alone even for a cross-posted video."
                                      },
                                      "published_at_epoch": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Raw Unix epoch for `published_at` (seconds, or milliseconds when the upstream sent millis). Present only when the upstream sent a numeric epoch that was normalised to the ISO 8601 `published_at` string. Kept for one deprecation cycle for integrations pinned to the numeric form."
                                      },
                                      "usertags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.usertags",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.usertags"
                                        }
                                      },
                                      "coauthors": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram collaborative posts (the native \"Collab\" feature). The full list of co-author accounts on the post, as `{ id, username, full_name, is_verified, profile_pic_url }`. A collab post has ONE producer and appears in every co-author's grid, so `post.author` is whichever account created it, which is not necessarily the profile you queried. The complete set of accounts on a post is `post.author.username` plus every `username` in this array. An empty array means Instagram reports the post as NOT a collab; the field is absent on surfaces that carry no co-author signal, including `/v1/instagram/post` (its web source ships the field permanently empty, so use `/v1/instagram/post/stats` for a single post).",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram collaborative posts (the native \"Collab\" feature). The full list of co-author accounts on the post, as `{ id, username, full_name, is_verified, profile_pic_url }`. A collab post has ONE producer and appears in every co-author's grid, so `post.author` is whichever account created it, which is not necessarily the profile you queried. The complete set of accounts on a post is `post.author.username` plus every `username` in this array. An empty array means Instagram reports the post as NOT a collab; the field is absent on surfaces that carry no co-author signal, including `/v1/instagram/post` (its web source ships the field permanently empty, so use `/v1/instagram/post/stats` for a single post)."
                                        }
                                      },
                                      "music": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.music"
                                      },
                                      "sponsor_tags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram only: the brand accounts the post tags as its paid partner, as usernames (`[\"rolex\"]`). `[]` on a post with no partner tagged. Present on `/v1/instagram/post/stats`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram only: the brand accounts the post tags as its paid partner, as usernames (`[\"rolex\"]`). `[]` on a post with no partner tagged. Present on `/v1/instagram/post/stats`; absent on every other endpoint."
                                        }
                                      },
                                      "sponsored_disclosed": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "The platform's own disclosure that the post is paid or promotional: on Instagram the paid-partnership label (`is_paid_partnership`) or a tagged brand partner, on TikTok the label TikTok shows viewers (\"Paid partnership\", \"Commission paid\", \"Promotional content\"). `false` when the post carries the flag unset, null when it carries none. Present on `/v1/instagram/post/stats`, `/v1/instagram/search/reels` and `/v1/tiktok/search`; absent on every other endpoint."
                                      },
                                      "ai_label": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Instagram only: Instagram's AI-content label on the post, as the method Instagram reports: `classifier_score_high` (Instagram detected it, shown as \"Likely made with AI\"), `ai_created` or `ai_edited` (declared or detected as made or edited with AI). Null when the post carries no AI label. Present on `/v1/instagram/post/stats`; absent on every other endpoint."
                                      },
                                      "story_mentions": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: the accounts the story mentions with a mention sticker, as usernames in alphabetical order. `[]` when it mentions nobody. Present on `/v1/instagram/stories`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: the accounts the story mentions with a mention sticker, as usernames in alphabetical order. `[]` when it mentions nobody. Present on `/v1/instagram/stories`; absent on every other endpoint."
                                        }
                                      },
                                      "story_links": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: where the story's link stickers lead, as URLs in alphabetical order. Instagram wraps each link in its own redirect with a per-view click id; both are removed, so this is the destination itself. `[]` when the story has no link sticker. Present on `/v1/instagram/stories` and `/v1/instagram/highlight/detail`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: where the story's link stickers lead, as URLs in alphabetical order. Instagram wraps each link in its own redirect with a per-view click id; both are removed, so this is the destination itself. `[]` when the story has no link sticker. Present on `/v1/instagram/stories` and `/v1/instagram/highlight/detail`; absent on every other endpoint."
                                        }
                                      },
                                      "story_reshared_posts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Instagram stories only: the feed posts the story reshares, as post URLs (`https://www.instagram.com/p/{shortcode}/`, which `/v1/instagram/post` takes). `[]` when it reshares none. Present on `/v1/instagram/stories`; absent on every other endpoint.",
                                        "items": {
                                          "type": "string",
                                          "description": "Instagram stories only: the feed posts the story reshares, as post URLs (`https://www.instagram.com/p/{shortcode}/`, which `/v1/instagram/post` takes). `[]` when it reshares none. Present on `/v1/instagram/stories`; absent on every other endpoint."
                                        }
                                      },
                                      "location": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.location"
                                      },
                                      "media": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.media",
                                        "items": {
                                          "type": "object",
                                          "description": "Nested object: post.ext.media",
                                          "properties": {
                                            "type": {
                                              "type": "string",
                                              "description": "Leaf at post.ext.media.type"
                                            },
                                            "url": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.media.url"
                                            },
                                            "width": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.media.width"
                                            },
                                            "height": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.media.height"
                                            }
                                          }
                                        }
                                      },
                                      "top_comments": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.top_comments",
                                        "items": {
                                          "type": "object",
                                          "description": "Nested object: post.ext.top_comments",
                                          "properties": {
                                            "id": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.id"
                                            },
                                            "text": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.text"
                                            },
                                            "username": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.username"
                                            },
                                            "likes": {
                                              "type": [
                                                "integer",
                                                "null"
                                              ],
                                              "description": "Numeric at post.ext.top_comments.likes"
                                            },
                                            "published_at": {
                                              "type": [
                                                "string",
                                                "null"
                                              ],
                                              "description": "String at post.ext.top_comments.published_at"
                                            }
                                          }
                                        }
                                      },
                                      "hashtags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.hashtags",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.hashtags"
                                        }
                                      },
                                      "mentions": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.mentions",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.mentions"
                                        }
                                      },
                                      "mentioned_user_ids": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.mentioned_user_ids",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.mentioned_user_ids"
                                        }
                                      },
                                      "quoted_post": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Threads quote posts: the post this one quotes, as `{ id, url, author: { id, username }, text, media_urls, thumbnail_url }`. A quote post usually carries no caption or media of its own, and the text and video you see on the post's page belong to this attachment, by a different author. It is returned here rather than merged into `post.content`, so `content.*` always stays the outer post's own content and one account's media is never attributed to another. Absent on posts that are not quote posts."
                                      },
                                      "retweeted_post": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.retweeted_post"
                                      },
                                      "quote_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.quote_count"
                                      },
                                      "all_media_urls": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.all_media_urls",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.all_media_urls"
                                        }
                                      },
                                      "reaction_counts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.reaction_counts",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.reaction_counts"
                                        }
                                      },
                                      "share_urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.share_urn"
                                      },
                                      "post_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.post_type"
                                      },
                                      "activity_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.activity_id"
                                      },
                                      "published_at_precision": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.published_at_precision"
                                      },
                                      "author_urn": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_urn"
                                      },
                                      "author_headline": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_headline"
                                      },
                                      "author_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.author_type"
                                      },
                                      "is_repost_quote": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.is_repost_quote"
                                      },
                                      "article": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.article"
                                      },
                                      "reaction_type": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.reaction_type"
                                      },
                                      "download_media_urls": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.download_media_urls",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.download_media_urls"
                                        }
                                      },
                                      "tags": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.tags",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.tags"
                                        }
                                      },
                                      "categoryId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.categoryId"
                                      },
                                      "categoryTitle": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.categoryTitle"
                                      },
                                      "topicCategories": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.topicCategories",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.topicCategories"
                                        }
                                      },
                                      "duration": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.duration"
                                      },
                                      "license": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.license"
                                      },
                                      "madeForKids": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.madeForKids"
                                      },
                                      "defaultAudioLanguage": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.defaultAudioLanguage"
                                      },
                                      "hasPaidProductPlacement": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.hasPaidProductPlacement"
                                      },
                                      "caption": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.caption"
                                      },
                                      "position": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.position"
                                      },
                                      "playlistId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlistId"
                                      },
                                      "videoOwnerChannelId": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.videoOwnerChannelId"
                                      },
                                      "videoPublishedAt": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.videoPublishedAt"
                                      },
                                      "description": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.description"
                                      },
                                      "default_language": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.default_language"
                                      },
                                      "localizations": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.localizations"
                                      },
                                      "playlist_item_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_item_id"
                                      },
                                      "playlist_owner_channel_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_owner_channel_id"
                                      },
                                      "playlist_owner_title": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.playlist_owner_title"
                                      },
                                      "channel_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.channel_id"
                                      },
                                      "published_label": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.published_label"
                                      },
                                      "published_precision": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.published_precision"
                                      },
                                      "title_maybe_translated": {
                                        "type": [
                                          "boolean",
                                          "null"
                                        ],
                                        "description": "Boolean at post.ext.title_maybe_translated"
                                      },
                                      "video_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.video_count"
                                      },
                                      "posts_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "`/v1/instagram/hashtag` only: the exact number of public posts Instagram counts under the hashtag. Live: it moves between calls minutes apart."
                                      },
                                      "commerce": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.commerce"
                                      },
                                      "on_screen_texts": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.on_screen_texts",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.on_screen_texts"
                                        }
                                      },
                                      "topic_tag": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.topic_tag"
                                      },
                                      "reshare_count": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Numeric at post.ext.reshare_count"
                                      },
                                      "dsp_ids": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.dsp_ids"
                                      },
                                      "topic_tag_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.topic_tag_id"
                                      },
                                      "amazon_shop_lists": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_lists",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_lists"
                                        }
                                      },
                                      "amazon_shop_trending_picks": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_trending_picks",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_trending_picks"
                                        }
                                      },
                                      "amazon_shop_curations": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_curations",
                                        "items": {
                                          "type": "string",
                                          "description": "Leaf at post.ext.amazon_shop_curations"
                                        }
                                      },
                                      "amazon_shop_socials": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Array at post.ext.amazon_shop_socials",
                                        "items": {
                                          "type": "string",
                                          "description": "String at post.ext.amazon_shop_socials"
                                        }
                                      },
                                      "ad": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Ad Library envelope (Facebook `adlibrary/ad` and `adlibrary/company/ads` items): page_id, currency, spend, reach_estimate, publisher_platforms, categories, targeted_or_reached_countries, cta_text, cta_type, link_url, is_active, end_date_iso, display_format, title, video_hd_url, video_sd_url. Absent on every non-ad surface."
                                      },
                                      "apple_music": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.apple_music"
                                      },
                                      "feedback_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.feedback_id"
                                      },
                                      "question_id": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN (`/v1/naver/kin/search`) only: the question's id (Naver's `docId`), read from the row's link. Kin returns one row per answer, so several rows can share it; send `group=question` for one row per question."
                                      },
                                      "answer_no": {
                                        "type": [
                                          "integer",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN only: which answer of the question this row is (Naver's `answerNo`), read from the row's link."
                                      },
                                      "answer_nos": {
                                        "type": [
                                          "array",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN with `group=question` only: every answer number of the question that was on the page, best-ranked first.",
                                        "items": {
                                          "type": "integer",
                                          "description": "Naver KnowledgeiN with `group=question` only: every answer number of the question that was on the page, best-ranked first."
                                        }
                                      },
                                      "published_at_est": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Naver KnowledgeiN only: the question's date ESTIMATED from its id (`YYYY-MM-DD`, Korea time), never a published date, so `published_at` stays null. Absent for questions older than the calibration table."
                                      },
                                      "date_basis": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "How `post.ext.published_at_est` was derived. `kin_docid_estimate`: interpolated from the question id against question pages whose posted date was read."
                                      },
                                      "event": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Leaf at post.ext.event"
                                      },
                                      "trend": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "Trend-board envelope: what TikTok's own trend board says about the row. On `/v1/tiktok/hashtags/popular`: `rank`, `country_code`, `period_days`, `posts` and `views` for the window (not lifetime totals), `industry` / `industry_id` / `industry_label` for the first board the hashtag was read from (null for the overall board), `boards` listing EVERY board it ranks on as `{ industry, industry_id, industry_label, rank }` in board order (so a hashtag in the top 3 overall and on an industry board shows both), `popularity_curve` as `{ date, value }` with value 0 to 100 relative to the window's peak, and `top_creators`. On `/v1/tiktok/videos/popular`: `rank`, `country_code`, `period_days`, `order_by`, `period_views`, `organic_views`, `engagement_rate`, `six_second_view_through_rate`, `content_tags`. Absent on every non-board surface."
                                      },
                                      "updated_at": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.updated_at"
                                      },
                                      "alt_text": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.alt_text"
                                      },
                                      "board_name": {
                                        "type": [
                                          "string",
                                          "null"
                                        ],
                                        "description": "String at post.ext.board_name"
                                      }
                                    }
                                  }
                                }
                              },
                              "computed": {
                                "type": "object",
                                "description": "Server-computed analytics fields (consistent across platforms)",
                                "properties": {
                                  "engagement_rate": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Computed engagement rate (0..1). Null when the upstream lacks enough signal."
                                  },
                                  "language": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "ISO 639-1 language code detected from the post text. Null when undetectable."
                                  },
                                  "content_category": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Keyword-classified content category (e.g. tech, food, gaming). Null when undetectable."
                                  },
                                  "estimated_reach": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Estimated reach based on views or follower count. Null when uncomputable."
                                  },
                                  "save_rate": {
                                    "type": [
                                      "integer",
                                      "null"
                                    ],
                                    "description": "Numeric at computed.save_rate"
                                  },
                                  "relevance": {
                                    "type": [
                                      "object",
                                      "null"
                                    ],
                                    "description": "Nested object: computed.relevance",
                                    "properties": {
                                      "p": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.p"
                                      },
                                      "sense": {
                                        "type": "string",
                                        "description": "Leaf at computed.relevance.sense"
                                      },
                                      "depth": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.depth"
                                      },
                                      "spam": {
                                        "type": "integer",
                                        "description": "Numeric at computed.relevance.spam"
                                      }
                                    }
                                  },
                                  "labels": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Leaf at computed.labels"
                                  },
                                  "labels_evidence": {
                                    "type": [
                                      "string",
                                      "null"
                                    ],
                                    "description": "Leaf at computed.labels_evidence"
                                  }
                                }
                              }
                            }
                          }
                        },
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque cursor for the next page. Pass it back as a query parameter on endpoints that support pagination. Present only when the upstream reports more results."
                        },
                        "total": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Total number of matching results, when the upstream provides a count. Omitted otherwise."
                        },
                        "dropped": {
                          "type": "integer",
                          "description": "Number of upstream list items dropped because they could not be repaired to the endpoint schema. Valid list responses include 0.",
                          "example": 0
                        },
                        "empty_reason": {
                          "type": "string",
                          "enum": [
                            "no_matches",
                            "end_of_list",
                            "nothing_new_since",
                            "window_filtered",
                            "relevance_filtered",
                            "row_filtered",
                            "already_seen",
                            "source_empty_unverified"
                          ],
                          "description": "Present only when `items` is empty: why this page has no rows. Read it with `pagination.has_more`, which still says whether to keep paging. `no_matches`: The source answered and has no rows for this request. The same call returns the same answer, so change the query or the filters to get rows. `end_of_list`: This page was requested with a cursor and the list has no more rows. Stop paging. `nothing_new_since`: The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary. `window_filtered`: Every row on this page fell outside your date window (since, until, recent_days) or was a pinned post you excluded. Keep paging while pagination.has_more is true, or widen the window. `relevance_filtered`: relevance=filter judged every row on this page off-topic, and their ids are in data.relevance.dropped_ids. Keep paging while pagination.has_more is true, or send relevance=score to keep every row. `row_filtered`: A row filter you sent (such as country or min_views) kept no row on this page, and the report beside items counts what it dropped. Keep paging while pagination.has_more is true, or loosen the filter. `already_seen`: Every row on this page was one already returned to you on this walk, so there is nothing new here. Keep paging while pagination.has_more is true. `source_empty_unverified`: The source returned no rows and nothing confirmed it: no second source agreed, a source failed on the way, or a page mid-list came back empty. Retry later or with Cache-Control: no-cache, and keep paging while pagination.has_more is true.",
                          "example": "nothing_new_since"
                        },
                        "empty_reason_note": {
                          "type": "string",
                          "description": "Present only beside `empty_reason`: one or two sentences for a person or an agent saying what the code means and what to do next. The wording can improve; branch on `empty_reason`.",
                          "example": "The walk reached your since or stop_at_id boundary before any newer row, so nothing was published after it. Poll again later with the same boundary."
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      },
                      "required": [
                        "dropped"
                      ]
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Cursor state for this page. Present on every list response.",
                      "properties": {
                        "next_cursor": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Opaque token to send back as `cursor` for the next page, or null at end-of-list. Pass it back verbatim; never decode or trim it.",
                          "example": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0"
                        },
                        "has_more": {
                          "type": "boolean",
                          "description": "Explicit stop signal. Prefer this over inspecting next_cursor or comparing against total.",
                          "example": true
                        },
                        "page_size": {
                          "type": "integer",
                          "description": "Number of items in THIS page.",
                          "example": 30
                        },
                        "stopped_at": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "since",
                            "known_id",
                            "end",
                            null
                          ],
                          "description": "Present only when the request sent `since` or `stop_at_id`. Why the walk stopped: `since` (this page reached a post older than the date), `known_id` (this page reached the post you already hold), `end` (the list ran out first), or null (not yet, keep walking with `next_cursor`).",
                          "example": "known_id"
                        },
                        "typical_page_size": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "How many items a full page of this endpoint usually holds for this request, or null when it has not been verified, as on a source whose page changes with the request's parameters. An endpoint that merges several sources can return more. A page_size below it while has_more is true is a short page from the source, not the end of the list.",
                          "example": 10
                        },
                        "next_page_credits": {
                          "type": [
                            "integer",
                            "null"
                          ],
                          "description": "Credits the next page costs: what sending next_cursor back holds up front, priced from that request by the same pricer that charges it. Flat endpoints charge exactly this; metered endpoints refund what the page does not use; a cached page is free. Null when there is no next page.",
                          "example": 1
                        }
                      },
                      "required": [
                        "next_cursor",
                        "has_more",
                        "page_size"
                      ]
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached",
                    "pagination"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "reddit",
                  "endpoint": "/v1/reddit/search/media",
                  "data": {
                    "items": [
                      {
                        "post": {
                          "id": "1ngfk3g",
                          "url": "https://www.reddit.com/r/MechanicalKeyboards/comments/1ngfk3g/first_mechanical_keyboard_build/",
                          "content": {
                            "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                            "media_urls": null,
                            "thumbnail_url": "https://external-preview.redd.it/aC06lsnm94suYvrULw2iQltZ2_ovR5qIGUaeYU_BteI.jpeg?width=140&height=105&crop=140%3A105%2Csmart&auto=webp&s=8dfab828105abd379922fd79d0c89f3bf1992db9",
                            "duration_seconds": null
                          },
                          "author": {
                            "username": "user_ac34d4",
                            "display_name": "user_b158a1",
                            "avatar_url": "https://example.com/avatars/user_b6536c.png",
                            "verified": null
                          },
                          "engagement": {
                            "views": null,
                            "likes": 4,
                            "comments": 4,
                            "shares": null,
                            "saves": null
                          },
                          "flags": {
                            "nsfw": false,
                            "spoiler": null,
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2025-09-14T02:25:25.370Z",
                          "ext": {
                            "subreddit": "MechanicalKeyboards",
                            "title": "Sample comment text (redacted).",
                            "selftext": "[Link.](https://youtu.be/zBGOtffghuI)\n\n![img](hxa7j4klj1pf1)\n\n\\- M87 kit\n\n\\- Akko Dracula Linears\n\n\\- Aliexpress Marshmallow Keycaps",
                            "upvote_ratio": 1,
                            "flair": "Builds",
                            "content_language": "en",
                            "published_at_epoch": 1757816725
                          }
                        },
                        "computed": {
                          "engagement_rate": null,
                          "language": "es",
                          "content_category": "other",
                          "estimated_reach": null
                        }
                      },
                      {
                        "post": {
                          "id": "1thgcsn",
                          "url": "https://www.reddit.com/r/PHMechanicalKeyboard/comments/1thgcsn/first_custom_mechanical_keyboard_deep_and_thocky/",
                          "content": {
                            "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                            "media_urls": "https://packaged-media.redd.it/fyj7uj0dz12h1/dl/m2-res_640p.mp4?m=DASHPlaylist.mpd&v=1&e=1790942400&s=970aee631ebf965e8cd4560b36a7c312ca728c68",
                            "thumbnail_url": "https://external-preview.redd.it/dm9obHhhMWR6MTJoMcVzbRvxSScrHpvLL-i-_QQ7KNVKs99YMYhdGobkPhqs.png?format=pjpg&auto=webp&s=e88f686059330a0b9d358e9a47532cd86ff451a0",
                            "duration_seconds": 31
                          },
                          "author": {
                            "username": "user_52cea8",
                            "display_name": "user_c74a65",
                            "avatar_url": "https://example.com/avatars/user_497e68.png",
                            "verified": null
                          },
                          "engagement": {
                            "views": null,
                            "likes": 11,
                            "comments": 7,
                            "shares": null,
                            "saves": null
                          },
                          "flags": {
                            "nsfw": false,
                            "spoiler": null,
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2026-05-19T08:16:29.529Z",
                          "ext": {
                            "subreddit": "PHMechanicalKeyboard",
                            "title": "Sample comment text (redacted).",
                            "selftext": "Hello, everyone! I've sorta been in the keyboard rabbit hole this month and decided to build my first customized mx board, trying to find and build the deepest and thockiest boi. After weeks of planning and ordering stuff, here is what I have achieved. I had fun experimenting with different mods and configurations on this. I'm also very much satisfied with the final build.\n\nBoard: PMO Aurora80 - Cheese White\n\nGasket: Customized Gasket-structure (Top: Poron Sandwich Cotton Foam + IXPE Switch Padding+ PET Film Sheet) & (Bottom:  Poron Bearing Base Foam + Poron Base Cotton + Protective PET Film Sheet)\n\nPlate: White POM Plate\n\nSwitches: Keygeek Y2 (Hand-lubed, and spring swapped to 22mm, 62g Double-Stage Springs)\n\nStabilizers: Stock Stabilizers (Hand-lubed and Re-tuned)\n\nKeycaps: Ceramic Keycaps\n\nMods: Force Break Mod (w/ O-Ring Dampeners)",
                            "upvote_ratio": 0.9230769230769231,
                            "flair": "Flexing My Board",
                            "content_language": "en",
                            "published_at_epoch": 1779178589
                          }
                        },
                        "computed": {
                          "engagement_rate": null,
                          "language": "en",
                          "content_category": "other",
                          "estimated_reach": null
                        }
                      }
                    ],
                    "next_cursor": "MjQ=",
                    "total": null,
                    "dropped": 0
                  },
                  "credits_used": 1,
                  "request_id": "req_example000000",
                  "cached": false,
                  "pagination": {
                    "next_cursor": "sc.eyJ2IjoyLCJjIjoiTWpRPSIsImUiOiJyZWRkaXQvc2VhcmNoL21lZGlhIiwicCI6ImN1cnNvciJ9",
                    "has_more": true,
                    "page_size": 25
                  },
                  "credits_remaining": 9999,
                  "source": "captured",
                  "captured_at": "2026-10-02T07:33:23.757Z",
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/reddit/post/transcript": {
      "get": {
        "summary": "Get a Reddit video post transcript",
        "description": "Returns the transcript for a Reddit video post or direct `v.redd.it` URL when Reddit exposes a VTT caption file. Includes raw WebVTT in `raw_vtt` plus a parsed plain-text transcript. When Reddit doesn't expose captions, `transcript` is `null` and `transcriptNotAvailable` is `true`: credits are only deducted when a transcript is returned.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_post_transcript",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "premium",
        "x-credit-cost": 10,
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Reddit post URL or direct v.redd.it video URL.",
            "schema": {
              "type": "string"
            },
            "example": "https://www.reddit.com/r/youseeingthisshit/comments/1oiu9xm/football_nostalgiasaints_punter_head_coach_cant/"
          },
          {
            "name": "language",
            "in": "query",
            "required": false,
            "description": "2-letter language code. Defaults to `en`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/post/transcript"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "transcript": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Full transcript text. Plain string for TikTok/Facebook/Twitter; see `transcripts` for Instagram and the segmented YouTube shape."
                        },
                        "transcript_format": {
                          "type": "string",
                          "enum": [
                            "webvtt",
                            "text"
                          ],
                          "description": "TikTok only: the form of the `transcript` string. `webvtt` is WebVTT cues with timestamps (a caption track, or AI transcription of a longer video); `text` is plain text (AI transcription of a shorter video, which also returns `duration_seconds` and `duration_minutes`). Absent on other platforms and when there is no transcript."
                        },
                        "transcripts": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "Instagram transcript entries. Each item has a `text` field with the full transcript for that track.",
                          "items": {
                            "type": "object",
                            "description": "Transcript track",
                            "properties": {
                              "text": {
                                "type": "string",
                                "description": "Transcript text"
                              }
                            }
                          }
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      }
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "reddit",
                  "endpoint": "/v1/reddit/post/transcript",
                  "data": {
                    "url": "https://www.reddit.com/r/youseeingthisshit/comments/1oiu9xm/football_nostalgiasaints_punter_head_coach_cant/",
                    "post_id": "1oiu9xm",
                    "video_id": "eflpgc6r0zxf1",
                    "caption_url": "https://v.redd.it/eflpgc6r0zxf1/wh_ben_en.vtt",
                    "language": "en",
                    "raw_vtt": "WEBVTT\n\n00:00.000 --> 00:00.300\n<u>stop</u> on third down and now Barnhart I\nhanging\n\n00:00.300 --> 00:00.560\nstop <u>on</u> third down and now Barnhart I\nhanging\n\n00:00.560 --> 00:00.760\nstop on <u>third</u> down and now Barnhart I\nhanging\n\n00:00.760 --> 00:01.120\nstop on third <u>down</u> and now Barnhart I\nhanging\n\n00:01.120 --> 00:01.320\nstop on third down <u>and</u> now Barnhart I\nhanging\n\n00:01.320 --> 00:01.480\nstop on third down and <u>now</u> Barnhart I\nhanging\n\n00:01.480 --> 00:02.000\nstop on third down and now <u>Barnhart</u> I\nhanging\n\n00:02.000 --> 00:03.340\nstop on third down and now Barnhart <u>I</u>\nhanging\n\n00:03.340 --> 00:07.020\nstop on third down and now Barnhart I\n<u>hanging</u>\n\n00:07.020 --> 00:07.860\n<u>spiraling</u> punts touch back Barnhart\ncould not pull it up short of the end\n\n00:07.860 --> 00:08.440\nspiraling <u>punts</u> touch back Barnhart\ncould not pull it up short of the end\n\n00:08.440 --> 00:08.880\nspiraling punts <u>touch</u> back Barnhart\ncould not pull it up short of the end\n\n00:08.880 --> 00:09.160\nspiraling punts touch <u>back</u> Barnhart\ncould not pull it up short of the end\n\n00:09.160 --> 00:11.840\nspiraling punts touch back <u>Barnhart</u>\ncould not pull it up short of the end\n\n00:11.840 --> 00:12.160\nspiraling punts touch back Barnhart\n<u>could</u> not pull it up short of the end\n\n00:12.160 --> 00:12.460\nspiraling punts touch back Barnhart\ncould <u>not</u> pull it up short of the end\n\n00:12.460 --> 00:12.740\nspiraling punts touch back Barnhart\ncould not <u>pull</u> it up short of the end\n\n00:12.740 --> 00:12.880\nspiraling punts touch back Barnhart\ncould not pull <u>it</u> up short of the end\n\n00:12.880 --> 00:12.980\nspiraling punts touch back Barnhart\ncould not pull it <u>up</u> short of the end\n\n00:12.980 --> 00:13.260\nspiraling punts touch back Barnhart\ncould not pull it up <u>short</u> of the end\n\n00:13.260 --> 00:13.420\nspiraling punts touch back Barnhart\ncould not pull it up short <u>of</u> the end\n\n00:13.420 --> 00:13.520\nspiraling punts touch back Barnhart\ncould not pull it up short of <u>the</u> end\n\n00:13.520 --> 00:13.660\nspiraling punts touch back Barnhart\ncould not pull it up short of the <u>end</u>\n\n00:13.660 --> 00:13.940\n<u>zone</u> I think the way the returns have\nbeen going in this game I'd just assume\n\n00:13.940 --> 00:14.360\nzone <u>I</u> think the way the returns have\nbeen going in this game I'd just assume\n\n00:14.360 --> 00:14.520\nzone I <u>think</u> the way the returns have\nbeen going in this game I'd just assume\n\n00:14.520 --> 00:14.680\nzone I think <u>the</u> way the returns have\nbeen going in this game I'd just assume\n\n00:14.680 --> 00:14.840\nzone I think the <u>way</u> the returns have\nbeen going in this game I'd just assume\n\n00:14.840 --> 00:15.040\nzone I think the way <u>the</u> returns have\nbeen going in this game I'd just assume\n\n00:15.040 --> 00:15.320\nzone I think the way the <u>returns</u> have\nbeen going in this game I'd just assume\n\n00:15.320 --> 00:15.720\nzone I think the way the returns <u>have</u>\nbeen going in this game I'd just assume\n\n00:15.720 --> 00:15.880\nzone I think the way the returns have\n<u>been</u> going in this game I'd just assume\n\n00:15.880 --> 00:16.140\nzone I think the way the returns have\nbeen <u>going</u> in this game I'd just assume\n\n00:16.140 --> 00:16.320\nzone I think the way the returns have\nbeen going <u>in</u> this game I'd just assume\n\n00:16.320 --> 00:16.500\nzone I think the way the returns have\nbeen going in <u>this</u> game I'd just assume\n\n00:16.500 --> 00:16.700\nzone I think the way the returns have\nbeen going in this <u>game</u> I'd just assume\n\n00:16.700 --> 00:16.960\nzone I think the way the returns have\nbeen going in this game <u>I'd</u> just assume\n\n00:16.960 --> 00:17.120\nzone I think the way the returns have\nbeen going in this game I'd <u>just</u> assume\n\n00:17.120 --> 00:17.440\nzone I think the way the returns have\nbeen going in this game I'd just <u>assume</u>\n\n00:17.440 --> 00:18.720\n<u>wait</u> a minute what's going on out here\nthey down the ball that this is going to\n\n00:18.720 --> 00:19.220\nwait <u>a</u> minute what's going on out here\nthey down the ball that this is going to\n\n00:19.220 --> 00:19.400\nwait a <u>minute</u> what's going on out here\nthey down the ball that this is going to\n\n00:19.400 --> 00:19.700\nwait a minute <u>what's</u> going on out here\nthey down the ball that this is going to\n\n00:19.700 --> 00:19.780\nwait a minute what's <u>going</u> on out here\nthey down the ball that this is going to\n\n00:19.780 --> 00:20.100\nwait a minute what's going <u>on</u> out here\nthey down the ball that this is going to\n\n00:20.100 --> 00:20.260\nwait a minute what's going on <u>out</u> here\nthey down the ball that this is going to\n\n00:20.260 --> 00:20.500\nwait a minute what's going on out <u>here</u>\nthey down the ball that this is going to\n\n00:20.500 --> 00:21.920\nwait a minute what's going on out here\n<u>they</u> down the ball that this is going to\n\n00:21.920 --> 00:22.160\nwait a minute what's going on out here\nthey <u>down</u> the ball that this is going to\n\n00:22.160 --> 00:22.320\nwait a minute what's going on out here\nthey down <u>the</u> ball that this is going to\n\n00:22.320 --> 00:22.500\nwait a minute what's going on out here\nthey down the <u>ball</u> that this is going to\n\n00:22.500 --> 00:22.660\nwait a minute what's going on out here\nthey down the ball <u>that</u> this is going to\n\n00:22.660 --> 00:23.260\nwait a minute what's going on out here\nthey down the ball that <u>this</u> is going to\n\n00:23.260 --> 00:23.380\nwait a minute what's going on out here\nthey down the ball that this <u>is</u> going to\n\n00:23.380 --> 00:23.520\nwait a minute what's going on out here\nthey down the ball that this is <u>going</u> to\n\n00:23.520 --> 00:23.780\nwait a minute what's going on out here\nthey down the ball that this is going <u>to</u>\n\n00:23.780 --> 00:24.000\n<u>touch</u> down that that is one of the most\nunbelievable plays I've ever seen they\n\n00:24.000 --> 00:24.300\ntouch <u>down</u> that that is one of the most\nunbelievable plays I've ever seen they\n\n00:24.300 --> 00:26.680\ntouch down <u>that</u> that is one of the most\nunbelievable plays I've ever seen they\n\n00:26.680 --> 00:27.120\ntouch down that <u>that</u> is one of the most\nunbelievable plays I've ever seen they\n\n00:27.120 --> 00:28.360\ntouch down that that <u>is</u> one of the most\nunbelievable plays I've ever seen they\n\n00:28.360 --> 00:28.540\ntouch down that that is <u>one</u> of the most\nunbelievable plays I've ever seen they\n\n00:28.540 --> 00:28.640\ntouch down that that is one <u>of</u> the most\nunbelievable plays I've ever seen they\n\n00:28.640 --> 00:28.720\ntouch down that that is one of <u>the</u> most\nunbelievable plays I've ever seen they\n\n00:28.720 --> 00:28.900\ntouch down that that is one of the <u>most</u>\nunbelievable plays I've ever seen they\n\n00:28.900 --> 00:29.560\ntouch down that that is one of the most\n<u>unbelievable</u> plays I've ever seen they\n\n00:29.560 --> 00:30.260\ntouch down that that is one of the most\nunbelievable <u>plays</u> I've ever seen they\n\n00:30.260 --> 00:31.340\ntouch down that that is one of the most\nunbelievable plays <u>I've</u> ever seen they\n\n00:31.340 --> 00:31.540\ntouch down that that is one of the most\nunbelievable plays I've <u>ever</u> seen they\n\n00:31.540 --> 00:31.820\ntouch down that that is one of the most\nunbelievable plays I've ever <u>seen</u> they\n\n00:31.820 --> 00:32.020\ntouch down that that is one of the most\nunbelievable plays I've ever seen <u>they</u>\n\n00:32.020 --> 00:32.320\n<u>never</u> down the ball it was sitting in\nthe end zone and the Rams picked it up\n\n00:32.320 --> 00:32.640\nnever <u>down</u> the ball it was sitting in\nthe end zone and the Rams picked it up\n\n00:32.640 --> 00:32.940\nnever down <u>the</u> ball it was sitting in\nthe end zone and the Rams picked it up\n\n00:32.940 --> 00:33.240\nnever down the <u>ball</u> it was sitting in\nthe end zone and the Rams picked it up\n\n00:33.240 --> 00:33.500\nnever down the ball <u>it</u> was sitting in\nthe end zone and the Rams picked it up\n\n00:33.500 --> 00:33.600\nnever down the ball it <u>was</u> sitting in\nthe end zone and the Rams picked it up\n\n00:33.600 --> 00:33.940\nnever down the ball it was <u>sitting</u> in\nthe end zone and the Rams picked it up\n\n00:33.940 --> 00:34.140\nnever down the ball it was sitting <u>in</u>\nthe end zone and the Rams picked it up\n\n00:34.140 --> 00:34.280\nnever down the ball it was sitting in\n<u>the</u> end zone and the Rams picked it up\n\n00:34.280 --> 00:34.460\nnever down the ball it was sitting in\nthe <u>end</u> zone and the Rams picked it up\n\n00:34.460 --> 00:34.780\nnever down the ball it was sitting in\nthe end <u>zone</u> and the Rams picked it up\n\n00:34.780 --> 00:36.140\nnever down the ball it was sitting in\nthe end zone <u>and</u> the Rams picked it up\n\n00:36.140 --> 00:36.260\nnever down the ball it was sitting in\nthe end zone and <u>the</u> Rams picked it up\n\n00:36.260 --> 00:36.500\nnever down the ball it was sitting in\nthe end zone and the <u>Rams</u> picked it up\n\n00:36.500 --> 00:36.820\nnever down the ball it was sitting in\nthe end zone and the Rams <u>picked</u> it up\n\n00:36.820 --> 00:37.020\nnever down the ball it was sitting in\nthe end zone and the Rams picked <u>it</u> up\n\n00:37.020 --> 00:37.120\nnever down the ball it was sitting in\nthe end zone and the Rams picked it <u>up</u>\n\n00:37.120 --> 00:37.260\n<u>and</u> scored Bailey\n\n00:37.260 --> 00:37.600\nand <u>scored</u> Bailey\n\n00:37.600 --> 00:40.840\nand scored <u>Bailey</u>\n\n00:40.840 --> 00:41.120\n<u>can</u> pick it up boy that is heads up\nfootball by Bailey I guarantee you he\n\n00:41.120 --> 00:41.320\ncan <u>pick</u> it up boy that is heads up\nfootball by Bailey I guarantee you he\n\n00:41.320 --> 00:41.520\ncan pick <u>it</u> up boy that is heads up\nfootball by Bailey I guarantee you he\n\n00:41.520 --> 00:41.700\ncan pick it <u>up</u> boy that is heads up\nfootball by Bailey I guarantee you he\n\n00:41.700 --> 00:42.620\ncan pick it up <u>boy</u> that is heads up\nfootball by Bailey I guarantee you he\n\n00:42.620 --> 00:42.780\ncan pick it up boy <u>that</u> is heads up\nfootball by Bailey I guarantee you he\n\n00:42.780 --> 00:42.980\ncan pick it up boy that <u>is</u> heads up\nfootball by Bailey I guarantee you he\n\n00:42.980 --> 00:43.160\ncan pick it up boy that is <u>heads</u> up\nfootball by Bailey I guarantee you he\n\n00:43.160 --> 00:43.480\ncan pick it up boy that is heads <u>up</u>\nfootball by Bailey I guarantee you he\n\n00:43.480 --> 00:43.760\ncan pick it up boy that is heads up\n<u>football</u> by Bailey I guarantee you he\n\n00:43.760 --> 00:44.160\ncan pick it up boy that is heads up\nfootball <u>by</u> Bailey I guarantee you he\n\n00:44.160 --> 00:44.380\ncan pick it up boy that is heads up\nfootball by <u>Bailey</u> I guarantee you he\n\n00:44.380 --> 00:44.740\ncan pick it up boy that is heads up\nfootball by Bailey <u>I</u> guarantee you he\n\n00:44.740 --> 00:45.100\ncan pick it up boy that is heads up\nfootball by Bailey I <u>guarantee</u> you he\n\n00:45.100 --> 00:45.480\ncan pick it up boy that is heads up\nfootball by Bailey I guarantee <u>you</u> he\n\n00:45.480 --> 00:45.880\ncan pick it up boy that is heads up\nfootball by Bailey I guarantee you <u>he</u>\n\n00:45.880 --> 00:46.040\n<u>was</u> the only one on the field that knew\nwhat was going on Bailey's twenty eight\n\n00:46.040 --> 00:46.200\nwas <u>the</u> only one on the field that knew\nwhat was going on Bailey's twenty eight\n\n00:46.200 --> 00:46.480\nwas the <u>only</u> one on the field that knew\nwhat was going on Bailey's twenty eight\n\n00:46.480 --> 00:46.720\nwas the only <u>one</u> on the field that knew\nwhat was going on Bailey's twenty eight\n\n00:46.720 --> 00:46.860\nwas the only one <u>on</u> the field that knew\nwhat was going on Bailey's twenty eight\n\n00:46.860 --> 00:46.980\nwas the only one on <u>the</u> field that knew\nwhat was going on Bailey's twenty eight\n\n00:46.980 --> 00:47.260\nwas the only one on the <u>field</u> that knew\nwhat was going on Bailey's twenty eight\n\n00:47.260 --> 00:47.440\nwas the only one on the field <u>that</u> knew\nwhat was going on Bailey's twenty eight\n\n00:47.440 --> 00:47.560\nwas the only one on the field that <u>knew</u>\nwhat was going on Bailey's twenty eight\n\n00:47.560 --> 00:47.740\nwas the only one on the field that knew\n<u>what</u> was going on Bailey's twenty eight\n\n00:47.740 --> 00:47.880\nwas the only one on the field that knew\nwhat <u>was</u> going on Bailey's twenty eight\n\n00:47.880 --> 00:48.040\nwas the only one on the field that knew\nwhat was <u>going</u> on Bailey's twenty eight\n\n00:48.040 --> 00:48.500\nwas the only one on the field that knew\nwhat was going <u>on</u> Bailey's twenty eight\n\n00:48.500 --> 00:49.360\nwas the only one on the field that knew\nwhat was going on <u>Bailey's</u> twenty eight\n\n00:49.360 --> 00:49.620\nwas the only one on the field that knew\nwhat was going on Bailey's <u>twenty</u> eight\n\n00:49.620 --> 00:50.020\nwas the only one on the field that knew\nwhat was going on Bailey's twenty <u>eight</u>\n\n00:50.020 --> 00:50.940\n<u>look</u> at the bounce that's a rare bounce\nI mean nobody look at this watch look at\n\n00:50.940 --> 00:51.200\nlook <u>at</u> the bounce that's a rare bounce\nI mean nobody look at this watch look at\n\n00:51.200 --> 00:51.420\nlook at <u>the</u> bounce that's a rare bounce\nI mean nobody look at this watch look at\n\n00:51.420 --> 00:51.540\nlook at the <u>bounce</u> that's a rare bounce\nI mean nobody look at this watch look at\n\n00:51.540 --> 00:53.020\nlook at the bounce <u>that's</u> a rare bounce\nI mean nobody look at this watch look at\n\n00:53.020 --> 00:53.140\nlook at the bounce that's <u>a</u> rare bounce\nI mean nobody look at this watch look at\n\n00:53.140 --> 00:53.300\nlook at the bounce that's a <u>rare</u> bounce\nI mean nobody look at this watch look at\n\n00:53.300 --> 00:53.620\nlook at the bounce that's a rare <u>bounce</u>\nI mean nobody look at this watch look at\n\n00:53.620 --> 00:53.940\nlook at the bounce that's a rare bounce\n<u>I</u> mean nobody look at this watch look at\n\n00:53.940 --> 00:54.440\nlook at the bounce that's a rare bounce\nI <u>mean</u> nobody look at this watch look at\n\n00:54.440 --> 00:54.620\nlook at the bounce that's a rare bounce\nI mean <u>nobody</u> look at this watch look at\n\n00:54.620 --> 00:54.960\nlook at the bounce that's a rare bounce\nI mean nobody <u>look</u> at this watch look at\n\n00:54.960 --> 00:55.120\nlook at the bounce that's a rare bounce\nI mean nobody look <u>at</u> this watch look at\n\n00:55.120 --> 00:55.380\nlook at the bounce that's a rare bounce\nI mean nobody look at <u>this</u> watch look at\n\n00:55.380 --> 00:57.360\nlook at the bounce that's a rare bounce\nI mean nobody look at this watch look at\n\n00:57.360 --> 00:57.920\nlook at the bounce that's a rare bounce\nI mean nobody look at this <u>watch</u> look at\n\n00:57.920 --> 00:58.480\nlook at the bounce that's a rare bounce\nI mean nobody look at this watch <u>look</u> at\n\n00:58.480 --> 00:58.600\nlook at the bounce that's a rare bounce\nI mean nobody look at this watch look <u>at</u>\n\n00:58.600 --> 00:58.760\n<u>this</u> nobody is even looking at it\nBarnhart's walking off he unsnaps his\n\n00:58.760 --> 00:59.200\nthis <u>nobody</u> is even looking at it\nBarnhart's walking off he unsnaps his\n\n00:59.200 --> 00:59.460\nthis nobody <u>is</u> even looking at it\nBarnhart's walking off he unsnaps his\n\n00:59.460 --> 00:59.640\nthis nobody is <u>even</u> looking at it\nBarnhart's walking off he unsnaps his\n\n00:59.640 --> 00:59.940\nthis nobody is even <u>looking</u> at it\nBarnhart's walking off he unsnaps his\n\n00:59.940 --> 01:00.220\nthis nobody is even looking <u>at</u> it\nBarnhart's walking off he unsnaps his\n\n01:00.220 --> 01:00.420\nthis nobody is even looking at <u>it</u>\nBarnhart's walking off he unsnaps his\n\n01:00.420 --> 01:01.480\nthis nobody is even looking at it\n<u>Barnhart's</u> walking off he unsnaps his\n\n01:01.480 --> 01:01.760\nthis nobody is even looking at it\nBarnhart's <u>walking</u> off he unsnaps his\n\n01:01.760 --> 01:02.100\nthis nobody is even looking at it\nBarnhart's walking <u>off</u> he unsnaps his\n\n01:02.100 --> 01:02.320\nthis nobody is even looking at it\nBarnhart's walking off <u>he</u> unsnaps his\n\n01:02.320 --> 01:02.860\nthis nobody is even looking at it\nBarnhart's walking off he <u>unsnaps</u> his\n\n01:02.860 --> 01:03.020\nthis nobody is even looking at it\nBarnhart's walking off he unsnaps <u>his</u>\n\n01:03.020 --> 01:03.320\n<u>helmet</u> you see the officials going by\nthey were the only ones with him maybe a\n\n01:03.320 --> 01:03.800\nhelmet <u>you</u> see the officials going by\nthey were the only ones with him maybe a\n\n01:03.800 --> 01:04.260\nhelmet you <u>see</u> the officials going by\nthey were the only ones with him maybe a\n\n01:04.260 --> 01:04.440\nhelmet you see <u>the</u> officials going by\nthey were the only ones with him maybe a\n\n01:04.440 --> 01:04.820\nhelmet you see the <u>officials</u> going by\nthey were the only ones with him maybe a\n\n01:04.820 --> 01:05.120\nhelmet you see the officials <u>going</u> by\nthey were the only ones with him maybe a\n\n01:05.120 --> 01:05.420\nhelmet you see the officials going <u>by</u>\nthey were the only ones with him maybe a\n\n01:05.420 --> 01:06.720\nhelmet you see the officials going by\n<u>they</u> were the only ones with him maybe a\n\n01:06.720 --> 01:06.840\nhelmet you see the officials going by\nthey <u>were</u> the only ones with him maybe a\n\n01:06.840 --> 01:06.940\nhelmet you see the officials going by\nthey were <u>the</u> only ones with him maybe a\n\n01:06.940 --> 01:07.120\nhelmet you see the officials going by\nthey were the <u>only</u> ones with him maybe a\n\n01:07.120 --> 01:07.380\nhelmet you see the officials going by\nthey were the only <u>ones</u> with him maybe a\n\n01:07.380 --> 01:07.580\nhelmet you see the officials going by\nthey were the only ones <u>with</u> him maybe a\n\n01:07.580 --> 01:07.740\nhelmet you see the officials going by\nthey were the only ones with <u>him</u> maybe a\n\n01:07.740 --> 01:07.960\nhelmet you see the officials going by\nthey were the only ones with him <u>maybe</u> a\n\n01:07.960 --> 01:08.060\nhelmet you see the officials going by\nthey were the only ones with him maybe <u>a</u>\n\n01:08.060 --> 01:08.320\n<u>couple</u> Rams all of a sudden that's an\nNFL record or that there's nothing to\n\n01:08.320 --> 01:08.680\ncouple <u>Rams</u> all of a sudden that's an\nNFL record or that there's nothing to\n\n01:08.680 --> 01:09.540\ncouple Rams <u>all</u> of a sudden that's an\nNFL record or that there's nothing to\n\n01:09.540 --> 01:09.720\ncouple Rams all <u>of</u> a sudden that's an\nNFL record or that there's nothing to\n\n01:09.720 --> 01:09.800\ncouple Rams all of <u>a</u> sudden that's an\nNFL record or that there's nothing to\n\n01:09.800 --> 01:10.120\ncouple Rams all of a <u>sudden</u> that's an\nNFL record or that there's nothing to\n\n01:10.120 --> 01:10.420\ncouple Rams all of a sudden <u>that's</u> an\nNFL record or that there's nothing to\n\n01:10.420 --> 01:10.540\ncouple Rams all of a sudden that's <u>an</u>\nNFL record or that there's nothing to\n\n01:10.540 --> 01:10.760\ncouple Rams all of a sudden that's an\n<u>NFL</u> record or that there's nothing to\n\n01:10.760 --> 01:11.460\ncouple Rams all of a sudden that's an\nNFL <u>record</u> or that there's nothing to\n\n01:11.460 --> 01:12.200\ncouple Rams all of a sudden that's an\nNFL record <u>or</u> that there's nothing to\n\n01:12.200 --> 01:12.340\ncouple Rams all of a sudden that's an\nNFL record or <u>that</u> there's nothing to\n\n01:12.340 --> 01:12.880\ncouple Rams all of a sudden that's an\nNFL record or that <u>there's</u> nothing to\n\n01:12.880 --> 01:13.180\ncouple Rams all of a sudden that's an\nNFL record or that there's <u>nothing</u> to\n\n01:13.180 --> 01:13.400\ncouple Rams all of a sudden that's an\nNFL record or that there's nothing <u>to</u>\n\n01:13.400 --> 01:13.640\n<u>cool</u> about I mean it's exactly what\n\n01:13.640 --> 01:13.920\ncool <u>about</u> I mean it's exactly what\n\n01:13.920 --> 01:14.120\ncool about <u>I</u> mean it's exactly what\n\n01:14.120 --> 01:14.240\ncool about I <u>mean</u> it's exactly what\n\n01:14.240 --> 01:14.520\ncool about I mean <u>it's</u> exactly what\n\n01:14.520 --> 01:14.860\ncool about I mean it's <u>exactly</u> what\n\n01:14.860 --> 01:20.860\ncool about I mean it's exactly <u>what</u>\n\n01:20.860 --> 01:21.180\n<u>happened</u> that you could see never went\nover the end line and was never touched\n\n01:21.180 --> 01:21.240\nhappened <u>that</u> you could see never went\nover the end line and was never touched\n\n01:21.240 --> 01:21.940\nhappened that <u>you</u> could see never went\nover the end line and was never touched\n\n01:21.940 --> 01:22.100\nhappened that you <u>could</u> see never went\nover the end line and was never touched\n\n01:22.100 --> 01:22.320\nhappened that you could <u>see</u> never went\nover the end line and was never touched\n\n01:22.320 --> 01:22.600\nhappened that you could see <u>never</u> went\nover the end line and was never touched\n\n01:22.600 --> 01:23.340\nhappened that you could see never <u>went</u>\nover the end line and was never touched\n\n01:23.340 --> 01:23.600\nhappened that you could see never went\n<u>over</u> the end line and was never touched\n\n01:23.600 --> 01:23.760\nhappened that you could see never went\nover <u>the</u> end line and was never touched\n\n01:23.760 --> 01:23.940\nhappened that you could see never went\nover the <u>end</u> line and was never touched\n\n01:23.940 --> 01:24.240\nhappened that you could see never went\nover the end <u>line</u> and was never touched\n\n01:24.240 --> 01:24.540\nhappened that you could see never went\nover the end line <u>and</u> was never touched\n\n01:24.540 --> 01:24.720\nhappened that you could see never went\nover the end line and <u>was</u> never touched\n\n01:24.720 --> 01:25.040\nhappened that you could see never went\nover the end line and was <u>never</u> touched\n\n01:25.040 --> 01:25.300\nhappened that you could see never went\nover the end line and was never <u>touched</u>\n\n01:25.300 --> 01:25.640\n<u>I</u> think our cameraman and the officials\nwere the only ones who knew the ball was\n\n01:25.640 --> 01:25.840\nI <u>think</u> our cameraman and the officials\nwere the only ones who knew the ball was\n\n01:25.840 --> 01:26.020\nI think <u>our</u> cameraman and the officials\nwere the only ones who knew the ball was\n\n01:26.020 --> 01:26.620\nI think our <u>cameraman</u> and the officials\nwere the only ones who knew the ball was\n\n01:26.620 --> 01:26.740\nI think our cameraman <u>and</u> the officials\nwere the only ones who knew the ball was\n\n01:26.740 --> 01:26.860\nI think our cameraman and <u>the</u> officials\nwere the only ones who knew the ball was\n\n01:26.860 --> 01:27.200\nI think our cameraman and the <u>officials</u>\nwere the only ones who knew the ball was\n\n01:27.200 --> 01:27.440\nI think our cameraman and the officials\n<u>were</u> the only ones who knew the ball was\n\n01:27.440 --> 01:27.560\nI think our cameraman and the officials\nwere <u>the</u> only ones who knew the ball was\n\n01:27.560 --> 01:27.740\nI think our cameraman and the officials\nwere the <u>only</u> ones who knew the ball was\n\n01:27.740 --> 01:27.980\nI think our cameraman and the officials\nwere the only <u>ones</u> who knew the ball was\n\n01:27.980 --> 01:28.120\nI think our cameraman and the officials\nwere the only ones <u>who</u> knew the ball was\n\n01:28.120 --> 01:28.580\nI think our cameraman and the officials\nwere the only ones who <u>knew</u> the ball was\n\n01:28.580 --> 01:28.740\nI think our cameraman and the officials\nwere the only ones who knew <u>the</u> ball was\n\n01:28.740 --> 01:28.920\nI think our cameraman and the officials\nwere the only ones who knew the <u>ball</u> was\n\n01:28.920 --> 01:29.100\nI think our cameraman and the officials\nwere the only ones who knew the ball <u>was</u>\n\n01:29.100 --> 01:29.320\n<u>still</u> in play\n\n01:29.320 --> 01:29.460\nstill <u>in</u> play\n\n01:29.460 --> 01:29.720\nstill in <u>play</u>\n\n01:32.820 --> 01:33.340\n<u>look</u> at this look at that everybody\nthinks it's going out he thought the\n\n01:33.340 --> 01:33.860\nlook <u>at</u> this look at that everybody\nthinks it's going out he thought the\n\n01:33.860 --> 01:34.040\nlook at <u>this</u> look at that everybody\nthinks it's going out he thought the\n\n01:34.040 --> 01:34.340\nlook at this <u>look</u> at that everybody\nthinks it's going out he thought the\n\n01:34.340 --> 01:34.480\nlook at this look <u>at</u> that everybody\nthinks it's going out he thought the\n\n01:34.480 --> 01:34.620\nlook at this look at <u>that</u> everybody\nthinks it's going out he thought the\n\n01:34.620 --> 01:35.420\nlook at this look at that <u>everybody</u>\nthinks it's going out he thought the\n\n01:35.420 --> 01:35.820\nlook at this look at that everybody\n<u>thinks</u> it's going out he thought the\n\n01:35.820 --> 01:36.080\nlook at this look at that everybody\nthinks <u>it's</u> going out he thought the\n\n01:36.080 --> 01:36.240\nlook at this look at that everybody\nthinks it's <u>going</u> out he thought the\n\n01:36.240 --> 01:36.500\nlook at this look at that everybody\nthinks it's going <u>out</u> he thought the\n\n01:36.500 --> 01:37.100\nlook at this look at that everybody\nthinks it's going out <u>he</u> thought the\n\n01:37.100 --> 01:37.320\nlook at this look at that everybody\nthinks it's going out he <u>thought</u> the\n\n01:37.320 --> 01:37.480\nlook at this look at that everybody\nthinks it's going out he thought <u>the</u>\n\n01:37.480 --> 01:37.700\n<u>ball</u> was headed out of bounds it stays\nin and it's just sitting there and\n\n01:37.700 --> 01:37.980\nball <u>was</u> headed out of bounds it stays\nin and it's just sitting there and\n\n01:37.980 --> 01:38.220\nball was <u>headed</u> out of bounds it stays\nin and it's just sitting there and\n\n01:38.220 --> 01:38.480\nball was headed <u>out</u> of bounds it stays\nin and it's just sitting there and\n\n01:38.480 --> 01:38.580\nball was headed out <u>of</u> bounds it stays\nin and it's just sitting there and\n\n01:38.580 --> 01:38.820\nball was headed out of <u>bounds</u> it stays\nin and it's just sitting there and\n\n01:38.820 --> 01:39.700\nball was headed out of bounds <u>it</u> stays\nin and it's just sitting there and\n\n01:39.700 --> 01:40.000\nball was headed out of bounds it <u>stays</u>\nin and it's just sitting there and\n\n01:40.000 --> 01:40.400\nball was headed out of bounds it stays\n<u>in</u> and it's just sitting there and\n\n01:40.400 --> 01:40.560\nball was headed out of bounds it stays\nin <u>and</u> it's just sitting there and\n\n01:40.560 --> 01:40.740\nball was headed out of bounds it stays\nin and <u>it's</u> just sitting there and\n\n01:40.740 --> 01:40.860\nball was headed out of bounds it stays\nin and it's <u>just</u> sitting there and\n\n01:40.860 --> 01:41.160\nball was headed out of bounds it stays\nin and it's just <u>sitting</u> there and\n\n01:41.160 --> 01:41.500\nball was headed out of bounds it stays\nin and it's just sitting <u>there</u> and\n\n01:41.500 --> 01:42.060\nball was headed out of bounds it stays\nin and it's just sitting there <u>and</u>\n\n01:42.060 --> 01:42.340\n<u>Bailey</u> picks it up and I guarantee you\nalong with Buchanan there's nobody\n\n01:42.340 --> 01:42.760\nBailey <u>picks</u> it up and I guarantee you\nalong with Buchanan there's nobody\n\n01:42.760 --> 01:43.020\nBailey picks <u>it</u> up and I guarantee you\nalong with Buchanan there's nobody\n\n01:43.020 --> 01:43.140\nBailey picks it <u>up</u> and I guarantee you\nalong with Buchanan there's nobody\n\n01:43.140 --> 01:43.600\nBailey picks it up <u>and</u> I guarantee you\nalong with Buchanan there's nobody\n\n01:43.600 --> 01:43.740\nBailey picks it up and <u>I</u> guarantee you\nalong with Buchanan there's nobody\n\n01:43.740 --> 01:44.020\nBailey picks it up and I <u>guarantee</u> you\nalong with Buchanan there's nobody\n\n01:44.020 --> 01:44.420\nBailey picks it up and I guarantee <u>you</u>\nalong with Buchanan there's nobody\n\n01:44.420 --> 01:44.700\nBailey picks it up and I guarantee you\n<u>along</u> with Buchanan there's nobody\n\n01:44.700 --> 01:44.980\nBailey picks it up and I guarantee you\nalong <u>with</u> Buchanan there's nobody\n\n01:44.980 --> 01:45.220\nBailey picks it up and I guarantee you\nalong with <u>Buchanan</u> there's nobody\n\n01:45.220 --> 01:46.260\nBailey picks it up and I guarantee you\nalong with Buchanan <u>there's</u> nobody\n\n01:46.260 --> 01:46.660\nBailey picks it up and I guarantee you\nalong with Buchanan there's <u>nobody</u>\n\n01:46.660 --> 01:47.180\n<u>that's</u> even looking at by looking up\nthere goes a couple of times and Bailey\n\n01:47.180 --> 01:47.380\nthat's <u>even</u> looking at by looking up\nthere goes a couple of times and Bailey\n\n01:47.380 --> 01:47.580\nthat's even <u>looking</u> at by looking up\nthere goes a couple of times and Bailey\n\n01:47.580 --> 01:47.980\nthat's even looking <u>at</u> by looking up\nthere goes a couple of times and Bailey\n\n01:47.980 --> 01:48.140\nthat's even looking at <u>by</u> looking up\nthere goes a couple of times and Bailey\n\n01:48.140 --> 01:48.420\nthat's even looking at by <u>looking</u> up\nthere goes a couple of times and Bailey\n\n01:48.420 --> 01:48.660\nthat's even looking at by looking <u>up</u>\nthere goes a couple of times and Bailey\n\n01:48.660 --> 01:49.280\nthat's even looking at by looking up\n<u>there</u> goes a couple of times and Bailey\n\n01:49.280 --> 01:49.460\nthat's even looking at by looking up\nthere <u>goes</u> a couple of times and Bailey\n\n01:49.460 --> 01:51.160\nthat's even looking at by looking up\nthere goes <u>a</u> couple of times and Bailey\n\n01:51.160 --> 01:51.160\nthat's even looking at by looking up\nthere goes a <u>couple</u> of times and Bailey\n\n01:51.160 --> 01:51.980\nthat's even looking at by looking up\nthere goes a couple <u>of</u> times and Bailey\n\n01:51.980 --> 01:51.980\nthat's even looking at by looking up\nthere goes a couple of <u>times</u> and Bailey\n\n01:51.980 --> 01:51.980\nthat's even looking at by looking up\nthere goes a couple of times <u>and</u> Bailey\n\n01:51.980 --> 01:52.220\nthat's even looking at by looking up\nthere goes a couple of times and <u>Bailey</u>\n\n01:52.220 --> 01:55.580\n<u>that</u>\n\n01:55.580 --> 01:55.880\n<u>is</u> a NFL record a punt return for a\ntouchdown and there was no one there\n\n01:55.880 --> 01:56.080\nis <u>a</u> NFL record a punt return for a\ntouchdown and there was no one there\n\n01:56.080 --> 01:56.700\nis a <u>NFL</u> record a punt return for a\ntouchdown and there was no one there\n\n01:56.700 --> 01:57.360\nis a NFL <u>record</u> a punt return for a\ntouchdown and there was no one there\n\n01:57.360 --> 01:57.720\nis a NFL record <u>a</u> punt return for a\ntouchdown and there was no one there\n\n01:57.720 --> 01:57.940\nis a NFL record a <u>punt</u> return for a\ntouchdown and there was no one there\n\n01:57.940 --> 01:58.280\nis a NFL record a punt <u>return</u> for a\ntouchdown and there was no one there\n\n01:58.280 --> 01:58.660\nis a NFL record a punt return <u>for</u> a\ntouchdown and there was no one there\n\n01:58.660 --> 01:58.760\nis a NFL record a punt return for <u>a</u>\ntouchdown and there was no one there\n\n01:58.760 --> 01:59.040\nis a NFL record a punt return for a\n<u>touchdown</u> and there was no one there\n\n01:59.040 --> 02:00.020\nis a NFL record a punt return for a\ntouchdown <u>and</u> there was no one there\n\n02:00.020 --> 02:00.220\nis a NFL record a punt return for a\ntouchdown and <u>there</u> was no one there\n\n02:00.220 --> 02:00.400\nis a NFL record a punt return for a\ntouchdown and there <u>was</u> no one there\n\n02:00.400 --> 02:00.680\nis a NFL record a punt return for a\ntouchdown and there was <u>no</u> one there\n\n02:00.680 --> 02:00.920\nis a NFL record a punt return for a\ntouchdown and there was no <u>one</u> there\n\n02:00.920 --> 02:01.200\nis a NFL record a punt return for a\ntouchdown and there was no one <u>there</u>\n\n02:01.200 --> 02:01.940\n<u>Bailey</u> just ran a one hundred yard dash\nwith nobody around him and nobody even\n\n02:01.940 --> 02:02.280\nBailey <u>just</u> ran a one hundred yard dash\nwith nobody around him and nobody even\n\n02:02.280 --> 02:02.560\nBailey just <u>ran</u> a one hundred yard dash\nwith nobody around him and nobody even\n\n02:02.560 --> 02:02.840\nBailey just ran <u>a</u> one hundred yard dash\nwith nobody around him and nobody even\n\n02:02.840 --> 02:03.080\nBailey just ran a <u>one</u> hundred yard dash\nwith nobody around him and nobody even\n\n02:03.080 --> 02:03.380\nBailey just ran a one <u>hundred</u> yard dash\nwith nobody around him and nobody even\n\n02:03.380 --> 02:03.600\nBailey just ran a one hundred <u>yard</u> dash\nwith nobody around him and nobody even\n\n02:03.600 --> 02:04.020\nBailey just ran a one hundred yard <u>dash</u>\nwith nobody around him and nobody even\n\n02:04.020 --> 02:04.640\nBailey just ran a one hundred yard dash\n<u>with</u> nobody around him and nobody even\n\n02:04.640 --> 02:05.080\nBailey just ran a one hundred yard dash\nwith <u>nobody</u> around him and nobody even\n\n02:05.080 --> 02:05.440\nBailey just ran a one hundred yard dash\nwith nobody <u>around</u> him and nobody even\n\n02:05.440 --> 02:05.780\nBailey just ran a one hundred yard dash\nwith nobody around <u>him</u> and nobody even\n\n02:05.780 --> 02:06.660\nBailey just ran a one hundred yard dash\nwith nobody around him <u>and</u> nobody even\n\n02:06.660 --> 02:06.900\nBailey just ran a one hundred yard dash\nwith nobody around him and <u>nobody</u> even\n\n02:06.900 --> 02:07.260\nBailey just ran a one hundred yard dash\nwith nobody around him and nobody <u>even</u>\n\n02:07.260 --> 02:07.580\n<u>looking</u> at him or thinking about it.\n\n02:07.580 --> 02:07.840\nlooking <u>at</u> him or thinking about it.\n\n02:07.840 --> 02:08.020\nlooking at <u>him</u> or thinking about it.\n\n02:08.020 --> 02:08.280\nlooking at him <u>or</u> thinking about it.\n\n02:08.280 --> 02:08.560\nlooking at him or <u>thinking</u> about it.\n\n02:08.560 --> 02:09.020\nlooking at him or thinking <u>about</u> it.\n\n02:09.020 --> 02:09.160\nlooking at him or thinking about <u>it.</u>\n\n",
                    "transcript": "stop on third down and now Barnhart I hanging spiraling punts touch back Barnhart could not pull it up short of the end zone I think the way the returns have been going in this game I'd just assume wait a minute what's going on out here they down the ball that this is going to touch down that that is one of the most unbelievable plays I've ever seen they never down the ball it was sitting in the end zone and the Rams picked it up and scored Bailey can pick it up boy that is heads up football by Bailey I guarantee you he was the only one on the field that knew what was going on Bailey's twenty eight look at the bounce that's a rare bounce I mean nobody look at this look at the bounce that's a rare bounce I mean nobody look at this watch look at watch look at this nobody is even looking at it Barnhart's walking off he unsnaps his helmet you see the officials going by they were the only ones with him maybe a couple Rams all of a sudden that's an NFL record or that there's nothing to cool about I mean it's exactly what happened that you could see never went over the end line and was never touched I think our cameraman and the officials were the only ones who knew the ball was still in play look at this look at that everybody thinks it's going out he thought the ball was headed out of bounds it stays in and it's just sitting there and Bailey picks it up and I guarantee you along with Buchanan there's nobody that's even looking at by looking up there goes a couple of times and Bailey that is a NFL record a punt return for a touchdown and there was no one there Bailey just ran a one hundred yard dash with nobody around him and nobody even looking at him or thinking about it.",
                    "transcriptNotAvailable": false
                  },
                  "credits_used": 0,
                  "request_id": "req_example000000",
                  "cached": true,
                  "credits_remaining": 9999,
                  "source": "captured",
                  "captured_at": "2026-10-02T12:52:30.231Z",
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    },
    "/reddit/omni-search": {
      "get": {
        "summary": "Reddit VoC sweep: one keyword → threads across all of Reddit with subreddit attribution and top comments inline.",
        "description": "Runs reddit/search, expands the top N threads' comments in parallel (capped 15/thread), and rolls up which subreddits are talking. Each thread carries its comments at `threads[].top_comments` (the `include` parameter names this block `comments`; the field on the response is `top_comments`). Each rollup row is `{ name, subscribers, weekly_active_users, thread_count, tone }`. `subscribers` is how many accounts have joined the community and `weekly_active_users` is how many took part in the last week. The second is NOT a subset of the first, because Reddit does not require joining to post or comment: measured on r/keyboards the weekly figure (188,869) is HIGHER than the subscriber count (147,416), while on r/technology it is far lower. Read them as two independent signals, size against liveliness, and never as a ratio. Both are filled from the same source as `/v1/reddit/subreddit/details` and inherit its behaviour, so on a small share of rows one or both can be null while the rest of the row is unchanged. `tone` is one LLM label per community and degrades to null with a `_warnings` line rather than a silent blank. Returns sync JSON or a typed SSE stream that emits each thread as its comments land. Metered at 1 credit per search page + 1 credit per successfully-expanded thread (minimum 5); a failed thread isn't billed and the unused thread ceiling is refunded. `subreddit=` scopes the sweep to one community. The `next_cursor` resumes the search. Honest note: Reddit search is the slowest social search on the API (a 10 to 12s median, with a tail past 30s, so allow a 60s client timeout) and relevance is loose: a VoC sweep, not precision ranking.",
        "tags": [
          "reddit"
        ],
        "operationId": "get_reddit_omni_search",
        "security": [
          {
            "ApiKeyAuth": []
          },
          {
            "BearerAuth": []
          }
        ],
        "x-credit-tier": "standard",
        "x-credit-cost": 5,
        "x-credit-cost-min": 5,
        "x-credit-cost-max": 9,
        "x-credit-cost-formula": "1 credit for the search page plus 1 per thread SUCCESSFULLY expanded, with a floor of 5. The call holds `1 + threads` up front (the 8-thread maximum holds 9) and refunds every thread that failed to expand, so the floor is what most sweeps cost. Running the same sweep by hand - one reddit/search plus eight reddit/post/comments calls - costs the same 9 at best and gives you no subreddit rollup",
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Keyword or phrase to sweep across Reddit.",
            "schema": {
              "type": "string"
            },
            "example": "best mechanical keyboard"
          },
          {
            "name": "threads",
            "in": "query",
            "required": false,
            "description": "How many top threads to expand comments for (1-8, default 8).",
            "schema": {
              "type": "integer"
            },
            "example": 5
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Search sort order (relevance | new | top | comment_count).",
            "schema": {
              "type": "string",
              "enum": [
                "relevance",
                "new",
                "top",
                "comment_count"
              ]
            }
          },
          {
            "name": "timeframe",
            "in": "query",
            "required": false,
            "description": "Time window for the search (all | day | week | month | year).",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "day",
                "week",
                "month",
                "year"
              ]
            }
          },
          {
            "name": "subreddit",
            "in": "query",
            "required": false,
            "description": "Scope the sweep to one subreddit (bare name, no r/ prefix).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from a prior response's next_cursor to page deeper.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "description": "CSV subset of subreddits,comments (default both). The comments block is returned as `threads[].top_comments`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "Send `no-cache` to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the `no-cache` directive triggers this. See the Response Schema guide for details.",
            "schema": {
              "type": "string"
            },
            "example": "no-cache"
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives `409 IDEMPOTENCY_IN_PROGRESS` with a `Retry-After` of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: `credits_used` becomes 0, `idempotent_replay` becomes true, and `credits_remaining` is refreshed to the current balance. A known current balance appears in both the body and `X-Credits-Remaining` header; no balance row resolves to 0. On a transient lookup failure, body `credits_remaining` is null and `X-Credits-Remaining` is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use `Accept: application/json` when sending this header. The unsupported key-plus-SSE combination is rejected before billing.",
            "schema": {
              "type": "string"
            },
            "example": "7a5e1b4c-2d8f-4a3b-9c1e-6e8b4d2a1f3c"
          },
          {
            "name": "Prefer",
            "in": "header",
            "required": false,
            "description": "Send `respond-async` to run this GET in the background instead of waiting on the socket (or add `?async=true` to the query). The answer is 202 with `data.job_id`, a `Location` header and `Retry-After`; read the result free at `GET /v1/prism/jobs/{job_id}`, where `results[0].response` is exactly what this call returns. Nothing is held at submit: the call is validated now and billed as this call when it runs. Use it for calls that can outlast your client's timeout (MCP and many HTTP clients stop at 30 s). `Idempotency-Key` returns the same job on a retry.",
            "schema": {
              "type": "string"
            },
            "example": "respond-async"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "headers": {
              "X-Credits-Used": {
                "description": "Net credits charged for this response. Idempotency replays report 0.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Credits-Remaining": {
                "description": "Current authoritative balance. Free cache hits and idempotency replays omit this header when the balance cannot be determined; body `credits_remaining` is null instead.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Key-Credits-Remaining": {
                "description": "Only when the API key has a credit limit: the credits this key may still spend under that limit, after this call (never below 0). Absent for a key with no limit. `GET /v1/keys/current` has the limit and what is used.",
                "schema": {
                  "type": "integer",
                  "minimum": 0
                }
              },
              "X-Idempotent-Replay": {
                "description": "Present with value `true` only when this response replays a settled idempotency record.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              },
              "Idempotent-Replayed": {
                "description": "Present with value `true` only when this response replays a settled idempotency record. Same meaning as `X-Idempotent-Replay`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the request succeeded",
                      "example": true
                    },
                    "platform": {
                      "type": "string",
                      "description": "Platform name",
                      "example": "reddit"
                    },
                    "endpoint": {
                      "type": "string",
                      "description": "API endpoint path",
                      "example": "/v1/reddit/omni-search"
                    },
                    "data": {
                      "type": "object",
                      "description": "Platform-specific response data",
                      "properties": {
                        "metrics": {
                          "type": "object",
                          "description": "Key performance metrics",
                          "properties": {
                            "total_views": {
                              "type": "integer",
                              "description": "Total view count"
                            },
                            "total_likes": {
                              "type": "integer",
                              "description": "Total like count"
                            },
                            "total_comments": {
                              "type": "integer",
                              "description": "Total comment count"
                            },
                            "engagement_rate": {
                              "type": "number",
                              "description": "Computed engagement rate (0-1)"
                            }
                          }
                        },
                        "period": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Time period for the analytics data"
                        },
                        "breakdown": {
                          "type": [
                            "array",
                            "null"
                          ],
                          "description": "Per-item or per-period breakdown",
                          "items": {
                            "type": "object",
                            "description": "Breakdown entry"
                          }
                        },
                        "_warnings": {
                          "type": "array",
                          "description": "Non-fatal notices about this response (field-map drift, clamped computed values). Advisory only: its presence never means the request failed. Omitted entirely when there is nothing to report, so treat absent as 'no warnings'.",
                          "items": {
                            "type": "string",
                            "description": "One advisory notice."
                          }
                        }
                      }
                    },
                    "credits_used": {
                      "type": "integer",
                      "description": "Number of credits consumed",
                      "example": 1
                    },
                    "credits_remaining": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Current account balance, or null when this response could not establish one. Free cache hits always return null because they do not establish an authoritative post-request balance. An idempotency replay also returns null when its current-balance lookup fails. It is never a fabricated zero, so a zero here means the account really is empty. The authoritative reading is the one on a billed response, which comes straight from the deduction.",
                      "example": 4999
                    },
                    "request_id": {
                      "type": "string",
                      "description": "Unique request identifier for support",
                      "example": "req-abc123"
                    },
                    "cached": {
                      "type": "boolean",
                      "description": "Whether the response was served from cache",
                      "example": false
                    },
                    "idempotent_replay": {
                      "type": "boolean",
                      "description": "True only when this response is an idempotency replay",
                      "example": true
                    },
                    "meta": {
                      "type": "object",
                      "description": "Optional. Present only when this call completed a pattern that one other call does more cheaply or in one step, at most once per pattern per API key per day. Send the header `X-SocialCrawl-Hints: off` to never receive it.",
                      "properties": {
                        "hint": {
                          "type": "object",
                          "description": "One suggestion: what to call instead and why, with the price when the suggested call costs more than the calls it replaces.",
                          "properties": {
                            "code": {
                              "type": "string",
                              "description": "creator_card | batch_profiles | search_multi | incremental_sync | comment_labels | search_repeat | batch_comments | batch_jobs",
                              "example": "search_multi"
                            },
                            "message": {
                              "type": "string",
                              "description": "One sentence for a person or an agent to read.",
                              "example": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged."
                            },
                            "method": {
                              "type": "string",
                              "description": "GET or POST.",
                              "example": "GET"
                            },
                            "path": {
                              "type": "string",
                              "description": "The call the hint points to.",
                              "example": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
                            }
                          }
                        }
                      }
                    }
                  },
                  "required": [
                    "success",
                    "platform",
                    "endpoint",
                    "data",
                    "credits_used",
                    "credits_remaining",
                    "request_id",
                    "cached"
                  ]
                },
                "example": {
                  "success": true,
                  "platform": "reddit",
                  "endpoint": "/v1/reddit/omni-search",
                  "data": {
                    "threads": [
                      {
                        "post": {
                          "id": "1w4c63y",
                          "url": "https://www.reddit.com/r/keyboards/comments/1w4c63y/whats_the_best_mechanical_keyboard_in_2026_price/",
                          "content": {
                            "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                            "media_urls": null,
                            "thumbnail_url": null,
                            "duration_seconds": null
                          },
                          "author": {
                            "username": "user_2094f9",
                            "display_name": "user_8f6b77",
                            "avatar_url": null,
                            "verified": null
                          },
                          "engagement": {
                            "views": null,
                            "likes": 14,
                            "comments": 48,
                            "shares": null,
                            "saves": null
                          },
                          "flags": {
                            "nsfw": false,
                            "spoiler": false,
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2026-09-01T13:34:26.000Z",
                          "ext": {
                            "subreddit": "keyboards",
                            "title": "Sample comment text (redacted).",
                            "selftext": "I tried my buddy's board recently with brown tactile switches he told me last week and I actually loved that little bump not too loud but you still feel it. I dont want super clicky blue loud stuff because I'm on calls a lot so I don't want to disturb em. Really want something thocky and satisfying, hot-swappable would be amazing so I can try different switches later, maybe 75% or TKL? No idea! So far what interests me are Gateron Milky Yellow, Akko, Cherry MX Browns etc. Budget is around $180, trying to keep it under if possible",
                            "upvote_ratio": null,
                            "flair": null,
                            "content_language": null,
                            "published_at_epoch": 1788269666
                          }
                        },
                        "computed": {
                          "engagement_rate": null,
                          "language": "en",
                          "content_category": "other",
                          "estimated_reach": null
                        },
                        "top_comments": {
                          "items": [
                            {
                              "comment": {
                                "id": "user_410bc5",
                                "url": "https://example.com/redacted",
                                "parent_id": "user_a4a2bd",
                                "post_id": "user_a4a2bd",
                                "text": "Sample comment text (redacted).",
                                "author": {
                                  "username": "user_cab8fd",
                                  "display_name": "user_eaba57",
                                  "avatar_url": "https://example.com/avatars/user_5a5f3a.png",
                                  "verified": null
                                },
                                "engagement": {
                                  "likes": 7,
                                  "replies": 3
                                },
                                "flags": {
                                  "pinned": null,
                                  "deleted": false
                                },
                                "published_at": "2026-09-01T13:47:18.486Z",
                                "ext": {
                                  "depth": 0,
                                  "published_at_epoch": 1788270438
                                },
                                "replies": [
                                  {
                                    "id": "user_c68560",
                                    "url": "https://example.com/redacted",
                                    "parent_id": "user_410bc5",
                                    "post_id": "user_a4a2bd",
                                    "text": "Sample comment text (redacted).",
                                    "author": {
                                      "username": "user_2094f9",
                                      "display_name": "user_8f6b77",
                                      "avatar_url": "https://example.com/avatars/user_fc4f3a.png",
                                      "verified": null
                                    },
                                    "engagement": {
                                      "likes": 1,
                                      "replies": 1
                                    },
                                    "flags": {
                                      "pinned": null,
                                      "deleted": false
                                    },
                                    "published_at": "2026-09-01T14:48:18.953Z",
                                    "ext": {
                                      "depth": 1,
                                      "published_at_epoch": 1788274098
                                    },
                                    "replies": [
                                      {
                                        "id": "user_53b940",
                                        "url": "https://example.com/redacted",
                                        "parent_id": "user_c68560",
                                        "post_id": "user_a4a2bd",
                                        "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                                        "author": {
                                          "username": "user_b33bb4",
                                          "display_name": "user_332711",
                                          "avatar_url": "https://example.com/avatars/user_aa4622.png",
                                          "verified": null
                                        },
                                        "engagement": {
                                          "likes": 2,
                                          "replies": null
                                        },
                                        "flags": {
                                          "pinned": null,
                                          "deleted": false
                                        },
                                        "published_at": "2026-09-01T15:04:29.492Z",
                                        "ext": {
                                          "depth": 2,
                                          "published_at_epoch": 1788275069
                                        }
                                      }
                                    ]
                                  },
                                  {
                                    "id": "user_089350",
                                    "url": "https://example.com/redacted",
                                    "parent_id": "user_410bc5",
                                    "post_id": "user_a4a2bd",
                                    "text": "Sample comment text (redacted).",
                                    "author": {
                                      "username": "user_1410cb",
                                      "display_name": "user_7cedb8",
                                      "avatar_url": "https://example.com/avatars/user_d4093f.png",
                                      "verified": null
                                    },
                                    "engagement": {
                                      "likes": 1,
                                      "replies": null
                                    },
                                    "flags": {
                                      "pinned": null,
                                      "deleted": false
                                    },
                                    "published_at": "2026-09-11T08:21:00.428Z",
                                    "ext": {
                                      "depth": 1,
                                      "published_at_epoch": 1789114860
                                    }
                                  }
                                ]
                              },
                              "computed": {
                                "language": "en"
                              }
                            },
                            {
                              "comment": {
                                "id": "user_f68d6c",
                                "url": "https://example.com/redacted",
                                "parent_id": "user_a4a2bd",
                                "post_id": "user_a4a2bd",
                                "text": "Sample comment text (redacted).",
                                "author": {
                                  "username": "user_eaf02c",
                                  "display_name": "user_85b9be",
                                  "avatar_url": "https://example.com/avatars/user_497e68.png",
                                  "verified": null
                                },
                                "engagement": {
                                  "likes": 5,
                                  "replies": 2
                                },
                                "flags": {
                                  "pinned": null,
                                  "deleted": false
                                },
                                "published_at": "2026-09-01T17:42:39.828Z",
                                "ext": {
                                  "depth": 0,
                                  "published_at_epoch": 1788284559
                                },
                                "replies": [
                                  {
                                    "id": "user_f16cdf",
                                    "url": "https://example.com/redacted",
                                    "parent_id": "user_f68d6c",
                                    "post_id": "user_a4a2bd",
                                    "text": "Sample comment text (redacted).",
                                    "author": {
                                      "username": "user_2094f9",
                                      "display_name": "user_8f6b77",
                                      "avatar_url": "https://example.com/avatars/user_fc4f3a.png",
                                      "verified": null
                                    },
                                    "engagement": {
                                      "likes": 2,
                                      "replies": 2
                                    },
                                    "flags": {
                                      "pinned": null,
                                      "deleted": false
                                    },
                                    "published_at": "2026-09-02T06:10:10.523Z",
                                    "ext": {
                                      "depth": 1,
                                      "published_at_epoch": 1788329410
                                    },
                                    "replies": [
                                      {
                                        "id": "user_10a7e9",
                                        "url": "https://example.com/redacted",
                                        "parent_id": "user_f16cdf",
                                        "post_id": "user_a4a2bd",
                                        "text": "Sample comment text (redacted).",
                                        "author": {
                                          "username": "user_eaf02c",
                                          "display_name": "user_85b9be",
                                          "avatar_url": "https://example.com/avatars/user_497e68.png",
                                          "verified": null
                                        },
                                        "engagement": {
                                          "likes": 2,
                                          "replies": null
                                        },
                                        "flags": {
                                          "pinned": null,
                                          "deleted": false
                                        },
                                        "published_at": "2026-09-02T06:54:40.035Z",
                                        "ext": {
                                          "depth": 2,
                                          "published_at_epoch": 1788332080
                                        }
                                      },
                                      {
                                        "id": "user_cf593e",
                                        "url": "https://example.com/redacted",
                                        "parent_id": "user_f16cdf",
                                        "post_id": "user_a4a2bd",
                                        "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                                        "author": {
                                          "username": "user_6b01c0",
                                          "display_name": "user_5a9470",
                                          "avatar_url": "https://example.com/avatars/user_b6536c.png",
                                          "verified": null
                                        },
                                        "engagement": {
                                          "likes": 2,
                                          "replies": null
                                        },
                                        "flags": {
                                          "pinned": null,
                                          "deleted": false
                                        },
                                        "published_at": "2026-09-03T16:26:04.687Z",
                                        "ext": {
                                          "depth": 2,
                                          "published_at_epoch": 1788452764
                                        }
                                      }
                                    ]
                                  },
                                  {
                                    "id": "user_1b48b5",
                                    "url": "https://example.com/redacted",
                                    "parent_id": "user_f68d6c",
                                    "post_id": "user_a4a2bd",
                                    "text": "Sample comment text (redacted).",
                                    "author": {
                                      "username": "user_30dde2",
                                      "display_name": "user_2c2076",
                                      "avatar_url": "https://example.com/avatars/user_7e54f5.png",
                                      "verified": null
                                    },
                                    "engagement": {
                                      "likes": 1,
                                      "replies": null
                                    },
                                    "flags": {
                                      "pinned": null,
                                      "deleted": false
                                    },
                                    "published_at": "2026-09-05T17:15:52.436Z",
                                    "ext": {
                                      "depth": 1,
                                      "published_at_epoch": 1788628552
                                    }
                                  }
                                ]
                              },
                              "computed": {
                                "language": "en"
                              }
                            }
                          ],
                          "total": 23,
                          "next_cursor": null
                        }
                      },
                      {
                        "post": {
                          "id": "1wt7c82",
                          "url": "https://www.reddit.com/r/keyboards/comments/1wt7c82/reputable_brands/",
                          "content": {
                            "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                            "media_urls": null,
                            "thumbnail_url": null,
                            "duration_seconds": null
                          },
                          "author": {
                            "username": null,
                            "display_name": null,
                            "avatar_url": null,
                            "verified": null
                          },
                          "engagement": {
                            "views": null,
                            "likes": 6,
                            "comments": 26,
                            "shares": null,
                            "saves": null
                          },
                          "flags": {
                            "nsfw": false,
                            "spoiler": false,
                            "pinned": null,
                            "deleted": false
                          },
                          "published_at": "2026-09-29T11:15:12.000Z",
                          "ext": {
                            "subreddit": "keyboards",
                            "title": "Sample comment text (redacted).",
                            "selftext": "I've just gotten a pc (hooray) and I'm in the market for a daily driver/gaming keyboard and my initial research swayed me to Epomaker/Aula. However I found some quite troubling info about them such as not accepting warranties, viruses in their software, keyboards suddenly not working etc etc. I'm now pretty unsure on what brands are actually good and worth the money, I want to buy something I can just have for years to come and is preferably mechanical or analog. I looked up Wooting keyboards which seem great but they're a lot of money. Do any of you have a list of recommendations? Thank you in advance for your help :)",
                            "upvote_ratio": null,
                            "flair": null,
                            "content_language": null,
                            "published_at_epoch": 1790680512
                          }
                        },
                        "computed": {
                          "engagement_rate": null,
                          "language": "en",
                          "content_category": "other",
                          "estimated_reach": null
                        },
                        "top_comments": {
                          "items": [
                            {
                              "comment": {
                                "id": "user_38cf00",
                                "url": "https://example.com/redacted",
                                "parent_id": "user_8ef799",
                                "post_id": "user_8ef799",
                                "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                                "author": {
                                  "username": "user_d4a43a",
                                  "display_name": "user_bfe7ee",
                                  "avatar_url": "https://example.com/avatars/user_28767c.png",
                                  "verified": null
                                },
                                "engagement": {
                                  "likes": 6,
                                  "replies": 1
                                },
                                "flags": {
                                  "pinned": null,
                                  "deleted": false
                                },
                                "published_at": "2026-09-29T11:22:34.671Z",
                                "ext": {
                                  "depth": 0,
                                  "published_at_epoch": 1790680954
                                },
                                "replies": [
                                  {
                                    "id": "user_37e7e0",
                                    "url": "https://example.com/redacted",
                                    "parent_id": "user_38cf00",
                                    "post_id": "user_8ef799",
                                    "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                                    "author": {
                                      "username": "user_7d5ded",
                                      "display_name": "user_e6d494",
                                      "avatar_url": null,
                                      "verified": null
                                    },
                                    "engagement": {
                                      "likes": 2,
                                      "replies": 2
                                    },
                                    "flags": {
                                      "pinned": null,
                                      "deleted": false
                                    },
                                    "published_at": "2026-09-29T11:27:24.721Z",
                                    "ext": {
                                      "depth": 1,
                                      "published_at_epoch": 1790681244
                                    },
                                    "replies": [
                                      {
                                        "id": "user_df37fc",
                                        "url": "https://example.com/redacted",
                                        "parent_id": "user_37e7e0",
                                        "post_id": "user_8ef799",
                                        "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                                        "author": {
                                          "username": "user_4a4293",
                                          "display_name": "user_50c143",
                                          "avatar_url": "https://example.com/avatars/user_33212e.png",
                                          "verified": null
                                        },
                                        "engagement": {
                                          "likes": 4,
                                          "replies": 1
                                        },
                                        "flags": {
                                          "pinned": null,
                                          "deleted": false
                                        },
                                        "published_at": "2026-09-29T11:52:25.209Z",
                                        "ext": {
                                          "depth": 2,
                                          "published_at_epoch": 1790682745
                                        },
                                        "replies": [
                                          {
                                            "id": "user_3ab271",
                                            "url": "https://example.com/redacted",
                                            "parent_id": "user_df37fc",
                                            "post_id": "user_8ef799",
                                            "text": "Sample comment text (redacted).",
                                            "author": {
                                              "username": "user_7d5ded",
                                              "display_name": "user_e6d494",
                                              "avatar_url": null,
                                              "verified": null
                                            },
                                            "engagement": {
                                              "likes": -7,
                                              "replies": 1
                                            },
                                            "flags": {
                                              "pinned": null,
                                              "deleted": false
                                            },
                                            "published_at": "2026-09-29T11:53:33.804Z",
                                            "ext": {
                                              "depth": 3,
                                              "published_at_epoch": 1790682813
                                            },
                                            "replies": [
                                              {
                                                "id": "user_7108d6",
                                                "url": "https://example.com/redacted",
                                                "parent_id": "user_3ab271",
                                                "post_id": "user_8ef799",
                                                "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                                                "author": {
                                                  "username": "user_4a4293",
                                                  "display_name": "user_50c143",
                                                  "avatar_url": "https://example.com/avatars/user_33212e.png",
                                                  "verified": null
                                                },
                                                "engagement": {
                                                  "likes": 8,
                                                  "replies": 1
                                                },
                                                "flags": {
                                                  "pinned": null,
                                                  "deleted": false
                                                },
                                                "published_at": "2026-09-29T12:17:36.100Z",
                                                "ext": {
                                                  "depth": 4,
                                                  "published_at_epoch": 1790684256
                                                },
                                                "replies": [
                                                  {
                                                    "id": "user_863c91",
                                                    "url": "https://example.com/redacted",
                                                    "parent_id": "user_7108d6",
                                                    "post_id": "user_8ef799",
                                                    "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                                                    "author": {
                                                      "username": "user_7d5ded",
                                                      "display_name": "user_e6d494",
                                                      "avatar_url": null,
                                                      "verified": null
                                                    },
                                                    "engagement": {
                                                      "likes": -8,
                                                      "replies": 1
                                                    },
                                                    "flags": {
                                                      "pinned": null,
                                                      "deleted": false
                                                    },
                                                    "published_at": "2026-09-29T12:21:25.943Z",
                                                    "ext": {
                                                      "depth": 5,
                                                      "published_at_epoch": 1790684485
                                                    },
                                                    "replies": [
                                                      {
                                                        "id": "user_81a115",
                                                        "url": "https://example.com/redacted",
                                                        "parent_id": "user_863c91",
                                                        "post_id": "user_8ef799",
                                                        "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                                                        "author": {
                                                          "username": "user_4a4293",
                                                          "display_name": "user_50c143",
                                                          "avatar_url": "https://example.com/avatars/user_33212e.png",
                                                          "verified": null
                                                        },
                                                        "engagement": {
                                                          "likes": 6,
                                                          "replies": null
                                                        },
                                                        "flags": {
                                                          "pinned": null,
                                                          "deleted": false
                                                        },
                                                        "published_at": "2026-09-29T12:31:15.546Z",
                                                        "ext": {
                                                          "depth": 6,
                                                          "published_at_epoch": 1790685075
                                                        }
                                                      }
                                                    ]
                                                  }
                                                ]
                                              }
                                            ]
                                          }
                                        ]
                                      },
                                      {
                                        "id": "user_934d36",
                                        "url": "https://example.com/redacted",
                                        "parent_id": "user_37e7e0",
                                        "post_id": "user_8ef799",
                                        "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                                        "author": {
                                          "username": "user_d4a43a",
                                          "display_name": "user_bfe7ee",
                                          "avatar_url": "https://example.com/avatars/user_28767c.png",
                                          "verified": null
                                        },
                                        "engagement": {
                                          "likes": 1,
                                          "replies": 1
                                        },
                                        "flags": {
                                          "pinned": null,
                                          "deleted": false
                                        },
                                        "published_at": "2026-09-29T12:21:09.128Z",
                                        "ext": {
                                          "depth": 2,
                                          "published_at_epoch": 1790684469
                                        },
                                        "replies": [
                                          {
                                            "id": "user_5b6b8f",
                                            "url": "https://example.com/redacted",
                                            "parent_id": "user_934d36",
                                            "post_id": "user_8ef799",
                                            "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                                            "author": {
                                              "username": "user_7d5ded",
                                              "display_name": "user_e6d494",
                                              "avatar_url": null,
                                              "verified": null
                                            },
                                            "engagement": {
                                              "likes": 1,
                                              "replies": 1
                                            },
                                            "flags": {
                                              "pinned": null,
                                              "deleted": false
                                            },
                                            "published_at": "2026-09-29T12:24:32.356Z",
                                            "ext": {
                                              "depth": 3,
                                              "published_at_epoch": 1790684672
                                            },
                                            "replies": [
                                              {
                                                "id": "user_8ae0fc",
                                                "url": "https://example.com/redacted",
                                                "parent_id": "user_5b6b8f",
                                                "post_id": "user_8ef799",
                                                "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                                                "author": {
                                                  "username": "user_d4a43a",
                                                  "display_name": "user_bfe7ee",
                                                  "avatar_url": "https://example.com/avatars/user_28767c.png",
                                                  "verified": null
                                                },
                                                "engagement": {
                                                  "likes": 1,
                                                  "replies": null
                                                },
                                                "flags": {
                                                  "pinned": null,
                                                  "deleted": false
                                                },
                                                "published_at": "2026-09-29T12:54:54.098Z",
                                                "ext": {
                                                  "depth": 4,
                                                  "published_at_epoch": 1790686494
                                                }
                                              }
                                            ]
                                          }
                                        ]
                                      }
                                    ]
                                  }
                                ]
                              },
                              "computed": {
                                "language": "en"
                              }
                            },
                            {
                              "comment": {
                                "id": "user_4dd5f7",
                                "url": "https://example.com/redacted",
                                "parent_id": "user_8ef799",
                                "post_id": "user_8ef799",
                                "text": "Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted). Sample comment text (redacted).",
                                "author": {
                                  "username": "user_b78bf5",
                                  "display_name": "user_74e9f2",
                                  "avatar_url": "https://example.com/avatars/user_b6536c.png",
                                  "verified": null
                                },
                                "engagement": {
                                  "likes": 2,
                                  "replies": null
                                },
                                "flags": {
                                  "pinned": null,
                                  "deleted": false
                                },
                                "published_at": "2026-09-29T14:10:45.972Z",
                                "ext": {
                                  "depth": 0,
                                  "published_at_epoch": 1790691045
                                }
                              },
                              "computed": {
                                "language": "en"
                              }
                            }
                          ],
                          "total": 6,
                          "next_cursor": null
                        }
                      }
                    ],
                    "subreddits": [
                      {
                        "name": "keyboards",
                        "subscribers": 149465,
                        "weekly_active_users": 153313,
                        "thread_count": 4,
                        "tone": "positive",
                        "tone_distribution": {
                          "positive": 0.6666666666666666,
                          "negative": 0,
                          "mixed": 0.2222222222222222,
                          "neutral": 0.1111111111111111,
                          "items": 12,
                          "counted": 9
                        }
                      },
                      {
                        "name": "buildapc",
                        "subscribers": 8535797,
                        "weekly_active_users": 1564590,
                        "thread_count": 1,
                        "tone": "positive",
                        "tone_distribution": {
                          "positive": 0.6,
                          "negative": 0,
                          "mixed": 0,
                          "neutral": 0.4,
                          "items": 6,
                          "counted": 5
                        }
                      }
                    ],
                    "legs": [
                      {
                        "endpoint": "/v1/reddit/search",
                        "status": 200,
                        "credits_used": 1,
                        "latency_ms": 6483,
                        "error": null
                      },
                      {
                        "endpoint": "/v1/reddit/post/comments",
                        "status": 200,
                        "credits_used": 1,
                        "latency_ms": 686,
                        "error": null
                      }
                    ],
                    "coverage": 1,
                    "partial_failure": false,
                    "next_cursor": "eyJhZnRlciI6InNjMi5leUp6SWpvaVlpSXNJbU1pT2lKbGVVcHFXVmMxYTJGWFVtaGtSMVo2V0ROS2JHUklWbmxpYlZaclNXcHZhV1V4ZDJsak1sWnFaRWRzZG1Kc09IaFlNMEp3WTBkV2MyRlhOV3hZZWtKbVdqSjRkbGx0Um5OWU1qRjJXa2RzYldGWFZubGpNWGRwVDJ4M2FVMVdkMmxNUm5kcFl6SldhbVJIYkhaaWJEaDRXRE5DY0dOSFZuTmhWelZzV0hwR1ptSkhPV3BaVjNobVlsYzVhMkZYV25CYVdFcDZXRU5KTmxoRFNYbFlRMGx6V0VOS2VscFhUakJoVnpsMVdIcEtabU5IYkhkYVYzaHdZbTFXWmsxVVJtWmpXRlpzWTI1c1ptTXpWbTVhTWxaNlpFZHNkbUp1VG1OSmFuQmpTV3BhWTBscGVHTkpiazVzV1ROU2NHSXlOV1pOYkRsM1lWaENiR0pIYkhWYVZqZzBXREpTTldKdFJuUmhWMDVtVFZZNWFHSnVUak5hV0VwNldETkNlVnBZV25CYVdHUmpTV3B3WTBscVFtTkphWGhqU1c1T2JGa3pVbkJpTWpWbVRXdzVkMkZZUW14aVIyeDFXbFk0TkZneVVqVmliVVowWVZkT1prMXNPWGRpTTA0d1dETk9iRmxZU21waFJuZHBUMngzYVU0eGQybE1SbmRwWXpKV2FtUkhiSFppYkRoNldETkNjR05IVm5OaFZ6VnNXSHBDWmxwSWJIVlpWekZ3V1RFNGQxZ3pUakZaYmtwc1drZFNjR1JHT1hwYVYwWjVXVEpvWTBscWNHTkphbFpqU1dsNFkwbHVUbXhaTTFKd1lqSTFaazB4T1hkaFdFSnNZa2RzZFZwV09IZFlNbEkxWW0xR2RHRlhUbVpOVmpsb1pGaFNiMkl6U21aak1sWm9ZMjFPYjFoRFNUWllRMGw0V0VOS09VbHBkMmxhU0d4MVdWY3hjRmt4T1doaVIzaG1ZMjFHZFdFeVZubEphbTlwWWtkV2JsbFhUalZZTWtaMVl6TmtiR051VFdsTVEwcHNaVWhDYkdOdGJHeGliVTVzV0ROT2JHSkhWbXBrUjJ4MlltbEpOa2x0VWpWaWJVWjBZVmRPWmxsWGVITkphWGRwV2xob2QxcFlTbkJhVnpWcVdsWTVNbHBZU25waFZ6bDFTV3B2YVZwSFZucGhNMUoyWTBOSmMwbHVUbXhaTTFKd1lqSTFaazFzT1hkaFdFSnNZa2RzZFZwV09EUllNbEkxWW0xR2RHRlhUbVpOYkRsM1lqTk9NRmd6VG14WldFcHFZVU5KTmtscVkybG1VVDA5SW4wIn0"
                  },
                  "credits_used": 6,
                  "request_id": "req_example000000",
                  "cached": false,
                  "credits_remaining": 9999,
                  "source": "captured",
                  "captured_at": "2026-10-02T12:43:00.707Z",
                  "redacted": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid request - missing or malformed parameters",
            "x-error-codes": [
              "INVALID_REQUEST",
              "COHORT_MEMBER_LIMIT_EXCEEDED",
              "COHORT_LIMIT_EXCEEDED",
              "COHORT_IDENTITY_PLATFORM_UNSUPPORTED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INVALID_REQUEST",
                    "message": "Invalid request - missing or malformed parameters",
                    "status": 400,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - missing or invalid API key",
            "x-error-codes": [
              "MISSING_API_KEY",
              "INVALID_API_KEY"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "MISSING_API_KEY",
                    "message": "Unauthorized - missing or invalid API key",
                    "status": 401,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "402": {
            "description": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
            "x-error-codes": [
              "INSUFFICIENT_CREDITS",
              "KEY_BUDGET_EXCEEDED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INSUFFICIENT_CREDITS",
                    "message": "Payment required - the account balance is too low, or the calling key has spent its own per-key credit limit",
                    "status": 402,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "404": {
            "description": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
            "x-error-codes": [
              "ENDPOINT_NOT_FOUND",
              "RESOURCE_NOT_FOUND",
              "RUN_NOT_FOUND",
              "SCHEDULE_NOT_FOUND",
              "STREAM_NOT_FOUND"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "ENDPOINT_NOT_FOUND",
                    "message": "Not found - the endpoint does not exist, or the requested resource was not found upstream",
                    "status": 404,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed - wrong HTTP verb for this endpoint",
            "x-error-codes": [
              "METHOD_NOT_ALLOWED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "METHOD_NOT_ALLOWED",
                    "message": "Method not allowed - wrong HTTP verb for this endpoint",
                    "status": 405,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "409": {
            "description": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_CONFLICT",
              "IDEMPOTENCY_IN_PROGRESS",
              "IDEMPOTENCY_REPLAY_UNAVAILABLE",
              "COHORT_IDENTITY_CONFLICT",
              "COHORT_QUERY_NOT_CANCELLABLE",
              "COHORT_QUERY_NOT_READY",
              "RUN_STATE_CONFLICT",
              "STREAM_STATE_CONFLICT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_CONFLICT",
                    "message": "Conflict - an idempotent request is still in flight, its completed body exceeded the replay limit, or the cohort resource is not in a state that allows this operation",
                    "status": 409,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "410": {
            "description": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
            "x-error-codes": [
              "RUN_EXPIRED",
              "CURSOR_EXPIRED"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RUN_EXPIRED",
                    "message": "Gone - the discover run's retention passed and its rows were deleted; start a new run. On the events feed, the cursor is older than the 30-day retention; restart from cursor=oldest",
                    "status": 410,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "413": {
            "description": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
            "x-error-codes": [
              "PAYLOAD_TOO_LARGE",
              "COHORT_RESULT_TOO_LARGE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "PAYLOAD_TOO_LARGE",
                    "message": "Payload too large: the JSON request body exceeds the 1 MB size limit and is rejected before parsing, or a single cohort result cannot fit beneath the 1 MB response-page ceiling",
                    "status": 413,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "422": {
            "description": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
            "x-error-codes": [
              "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
              "NEEDS_ASYNC"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "IDEMPOTENCY_KEY_PAYLOAD_MISMATCH",
                    "message": "Idempotency payload mismatch - this Idempotency-Key was already used with a different request payload; or a discover request with async=false is over what one call can answer (NEEDS_ASYNC)",
                    "status": 422,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "429": {
            "description": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
            "x-error-codes": [
              "RATE_LIMITED",
              "CONCURRENCY_LIMIT"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "RATE_LIMITED",
                    "message": "Rate or concurrency limit exceeded. `RATE_LIMITED`: more than 600 requests in a 1-minute sliding window on this API key (headers `X-RateLimit-Limit`/`Remaining`/`Reset`; `Retry-After` is seconds until the window resets). `CONCURRENCY_LIMIT`: more than 50 simultaneous in-flight requests (headers `X-Concurrency-Limit`/`Remaining`; short static `Retry-After`). Both are unbilled. Honor `Retry-After`, then back off with jitter. See /docs/rate-limits.",
                    "status": 429,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
            "x-error-codes": [
              "INTERNAL_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "INTERNAL_ERROR",
                    "message": "Internal server error - an immediate refund is attempted; credits_used reports the committed net charge and exact compensation is queued if that refund cannot commit",
                    "status": 500,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "502": {
            "description": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Upstream error - the platform returned an error; an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 502,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
            "x-error-codes": [
              "SERVICE_UNAVAILABLE"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "SERVICE_UNAVAILABLE",
                    "message": "Service unavailable - the request is unbilled when rejected before deduction, otherwise an immediate refund is attempted and credits_used reports the committed net charge",
                    "status": 503,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          },
          "504": {
            "description": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
            "x-error-codes": [
              "UPSTREAM_ERROR"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                },
                "example": {
                  "success": false,
                  "error": {
                    "type": "UPSTREAM_ERROR",
                    "message": "Gateway timeout - the request was still running close to the platform time limit and is answered as UPSTREAM_ERROR, the same code as 502. An immediate refund is attempted and credits_used reports the committed net charge. When details.retry_with is set, retryable is false and there is no Retry-After",
                    "status": 504,
                    "doc_url": "https://www.socialcrawl.dev/docs/errors"
                  },
                  "credits_used": 0,
                  "credits_remaining": null,
                  "request_id": "req-abc123"
                }
              }
            }
          }
        }
      }
    }
  },
  "x-full-spec": "https://www.socialcrawl.dev/v1/openapi.json"
}
