{"openapi":"3.1.0","info":{"title":"Reddit Mobile GraphQL API","description":"REST wrapper over Reddit's mobile GraphQL API: feeds, search, posts, comments, users and subreddit metadata, with caching and failover.\n\nEvery failure answers `{\"error\": …, \"code\": …, \"details\": {}}`. The complete code taxonomy — meaning, status and whether retrying helps — is documented in `docs/ERRORS.md` and repeated on each response below.","version":"1.0.0"},"paths":{"/v1/search":{"get":{"tags":["search"],"summary":"Search posts","operationId":"search_v1_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":500,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"subreddit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict to a single subreddit","title":"Subreddit"},"description":"Restrict to a single subreddit"},{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SearchSort","default":"relevance"}},{"name":"time","in":"query","required":false,"schema":{"$ref":"#/components/schemas/TimeRange","default":"all"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"description":"Cursor from a previous page","title":"After"},"description":"Cursor from a previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/search/trending":{"get":{"tags":["search"],"summary":"Trending searches","operationId":"trending_v1_search_trending_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrendingListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/search/subreddits":{"get":{"tags":["search"],"summary":"Search subreddits","description":"Community search returns a lightweight community: `prefixed_name`, `title`, `description`, `type`, `created_utc` and `submit_text` are not returned by this pane and arrive as schema defaults. Fetch `GET /v1/r/{subreddit}/about` for the complete record.","operationId":"search_subreddits_v1_search_subreddits_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":500,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"description":"Cursor from a previous page","title":"After"},"description":"Cursor from a previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubredditSearchListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/search/users":{"get":{"tags":["search"],"summary":"Search users","description":"**People search returns a reduced profile, not a full one.** Of the karma fields only `karma_total` is populated; `karma_posts`, `karma_comments`, `account_type`, `is_verified`, `is_premium`, `is_employee`, `is_accepting_followers`, `cake_day`, `created_utc` and `profile_is_nsfw` are not returned by this pane and arrive as schema defaults — a `false` here means *unknown*, not *no*. Fetch `GET /v1/user/{username}` for the complete profile.","operationId":"search_users_v1_search_users_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":500,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"description":"Cursor from a previous page","title":"After"},"description":"Cursor from a previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSearchListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/search/comments":{"get":{"tags":["search"],"summary":"Search comments","description":"Comments are returned flat, each with the title and URL of its post. `depth` is always 0 and `replies` always empty — search has no tree.","operationId":"search_comments_v1_search_comments_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":500,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"description":"Cursor from a previous page","title":"After"},"description":"Cursor from a previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentSearchListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/r/{subreddit}":{"get":{"tags":["subreddit"],"summary":"Subreddit feed","operationId":"subreddit_feed_v1_r__subreddit__get","parameters":[{"name":"subreddit","in":"path","required":true,"schema":{"type":"string","minLength":2,"maxLength":24,"description":"Subreddit name","title":"Subreddit"},"description":"Subreddit name"},{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/FeedSort","default":"hot"}},{"name":"time","in":"query","required":false,"schema":{"$ref":"#/components/schemas/TimeRange","default":"all"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"description":"Cursor from a previous page","title":"After"},"description":"Cursor from a previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/r/{subreddit}/about":{"get":{"tags":["subreddit"],"summary":"Subreddit metadata","operationId":"subreddit_about_v1_r__subreddit__about_get","parameters":[{"name":"subreddit","in":"path","required":true,"schema":{"type":"string","minLength":2,"maxLength":24,"description":"Subreddit name","title":"Subreddit"},"description":"Subreddit name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubredditV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/r/{subreddit}/rules":{"get":{"tags":["subreddit"],"summary":"Subreddit rules","description":"The community's rules as configured by its moderators. Falls back to parsing the sidebar markdown for the rare community that has configured none, in which case only `rule_number` and `rule_text` are populated.","operationId":"subreddit_rules_v1_r__subreddit__rules_get","parameters":[{"name":"subreddit","in":"path","required":true,"schema":{"type":"string","minLength":2,"maxLength":24,"description":"Subreddit name","title":"Subreddit"},"description":"Subreddit name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/r/{subreddit}/styles":{"get":{"tags":["subreddit"],"summary":"Styles, rules and widgets","description":"Visual styles, the moderator-configured rules and the sidebar/topbar widget layout. Shares its upstream call and cache entry with `/rules`. Widgets are passed through unnormalised.","operationId":"subreddit_styles_v1_r__subreddit__styles_get","parameters":[{"name":"subreddit","in":"path","required":true,"schema":{"type":"string","minLength":2,"maxLength":24,"description":"Subreddit name","title":"Subreddit"},"description":"Subreddit name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubredditStylesV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/r/{subreddit}/taxonomy":{"get":{"tags":["subreddit"],"summary":"Subreddit topics","description":"The taxonomy topics a community is classified and ranked in.","operationId":"subreddit_taxonomy_v1_r__subreddit__taxonomy_get","parameters":[{"name":"subreddit","in":"path","required":true,"schema":{"type":"string","minLength":2,"maxLength":24,"description":"Subreddit name","title":"Subreddit"},"description":"Subreddit name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxonomyListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/r/{subreddit}/highlights":{"get":{"tags":["subreddit"],"summary":"Mod-highlighted posts","description":"Posts the moderators pinned to the top of the community. Most communities have none and return an empty list.","operationId":"subreddit_highlights_v1_r__subreddit__highlights_get","parameters":[{"name":"subreddit","in":"path","required":true,"schema":{"type":"string","minLength":2,"maxLength":24,"description":"Subreddit name","title":"Subreddit"},"description":"Subreddit name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HighlightListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/r/{subreddit}/wiki/{page}":{"get":{"tags":["subreddit"],"summary":"Wiki page","description":"Wiki page content. Reddit stores these as richtext documents, not markdown: `content` is the rendered plain text and `richtext` carries the original document. Nested pages such as `config/sidebar` are supported.","operationId":"subreddit_wiki_page_v1_r__subreddit__wiki__page__get","parameters":[{"name":"subreddit","in":"path","required":true,"schema":{"type":"string","minLength":2,"maxLength":24,"description":"Subreddit name","title":"Subreddit"},"description":"Subreddit name"},{"name":"page","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":300,"description":"Wiki page, e.g. `index` or `config/sidebar`","title":"Page"},"description":"Wiki page, e.g. `index` or `config/sidebar`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WikiPageV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/post/{post_id}":{"get":{"tags":["posts"],"summary":"Post details","operationId":"post_details_v1_post__post_id__get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":23,"description":"Post id, e.g. t3_1vekfof","title":"Post Id"},"description":"Post id, e.g. t3_1vekfof"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/post/{post_id}/comments":{"get":{"tags":["posts"],"summary":"Post comments (flat list)","description":"Returns comments as a flat list ordered depth-first. Use `depth` and `parent_id` to rebuild the tree; `has_more` marks truncated branches.","operationId":"post_comments_v1_post__post_id__comments_get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":23,"description":"Post id, e.g. t3_1vekfof","title":"Post Id"},"description":"Post id, e.g. t3_1vekfof"},{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/CommentSort","default":"best"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Comments requested upstream","default":100,"title":"Limit"},"description":"Comments requested upstream"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/posts":{"post":{"tags":["posts"],"summary":"Batch post lookup","description":"Fetch several posts in one call. Results keep the order of `ids`; ids Reddit does not return (deleted or unknown posts) are omitted, so the response can be shorter than the request.\n\n**The number of ids per call is capped by your plan** — basic 10, pro 25, ultra 50, mega 100. Exceeding it is a `400 INVALID_INPUT` whose `details` carry your plan and its limit; split the list or upgrade.","operationId":"batch_posts_v1_posts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchPostsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/user/{username}":{"get":{"tags":["users"],"summary":"User profile","operationId":"user_profile_v1_user__username__get","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":23,"description":"Reddit username","title":"Username"},"description":"Reddit username"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/user/{username}/posts":{"get":{"tags":["users"],"summary":"User posts","operationId":"user_posts_v1_user__username__posts_get","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":23,"description":"Reddit username","title":"Username"},"description":"Reddit username"},{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/UserSort","default":"new"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"description":"Cursor from a previous page","title":"After"},"description":"Cursor from a previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/user/{username}/trophies":{"get":{"tags":["users"],"summary":"User trophies","operationId":"user_trophies_v1_user__username__trophies_get","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":23,"description":"Reddit username","title":"Username"},"description":"Reddit username"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrophyListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/user/{username}/comments":{"get":{"tags":["users"],"summary":"User comments (flat list)","operationId":"user_comments_v1_user__username__comments_get","parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":23,"description":"Reddit username","title":"Username"},"description":"Reddit username"},{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/UserSort","default":"new"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"description":"Cursor from a previous page","title":"After"},"description":"Cursor from a previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feed/popular":{"get":{"tags":["feeds"],"summary":"Reddit popular feed","operationId":"popular_feed_v1_feed_popular_get","parameters":[{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/PopularSort","default":"best"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"description":"Cursor from a previous page","title":"After"},"description":"Cursor from a previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feed/explore":{"get":{"tags":["feeds"],"summary":"Recommended communities and topics (deprecated)","description":"**Deprecated — use `GET /v1/discover/communities`.** The name promised a feed of posts and this endpoint has never returned any; it is kept, byte-for-byte identical, so integrations built against it keep working.\n\nCommunities and topics Reddit recommends — **no posts**. Each element is one of `topic_group`, `taxonomy_topics` or `community_recommendations`; use `/v1/feed/popular` or `/v1/r/{subreddit}` when you want posts. Reddit reports no next page on any sort observed, so expect a single page.","operationId":"explore_feed_v1_feed_explore_get","deprecated":true,"parameters":[{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/PopularSort","default":"best"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"description":"Cursor from a previous page","title":"After"},"description":"Cursor from a previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveryV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/discover/communities":{"get":{"tags":["discovery"],"summary":"Recommended communities and topics (no posts)","description":"Communities and topics Reddit recommends — **no posts**. Each element is one of `topic_group`, `taxonomy_topics` or `community_recommendations`; use `/v1/feed/popular` or `/v1/r/{subreddit}` when you want posts. Reddit reports no next page on any sort observed, so expect a single page.","operationId":"discover_communities_v1_discover_communities_get","parameters":[{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/PopularSort","default":"best"}},{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"description":"Cursor from a previous page","title":"After"},"description":"Cursor from a previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveryV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/subreddit/{subreddit}":{"get":{"tags":["intelligence"],"summary":"Analyse a community","description":"One call in place of paging a feed for a week and computing over it: activity rates, engagement distribution, what gets posted and linked, when the community is awake, how concentrated its authorship is, and which topics are rising.\n\n**Read `sample` before the numbers.** It reports how many posts were observed and what fraction of the window they reach back over; a `coverage` below 1.0 means the oldest part of the window is not represented. Percentiles are `null` below five posts rather than computed from too little.\n\nGrowth and emerging topics are measured against **the older half of the same window**, not against a stored history — this says what is moving within the window, not what is unusual for a normal week.","operationId":"analyze_subreddit_v1_intelligence_subreddit__subreddit__get","parameters":[{"name":"subreddit","in":"path","required":true,"schema":{"type":"string","minLength":2,"maxLength":24,"description":"Subreddit name","title":"Subreddit"},"description":"Subreddit name"},{"name":"window","in":"query","required":false,"schema":{"type":"string","description":"Period to summarise: a number followed by `m`, `h` or `d`. Between 15 minutes and 30 days; longer ranges need the history endpoints.","examples":["24h","7d","30d"],"default":"7d","title":"Window"},"description":"Period to summarise: a number followed by `m`, `h` or `d`. Between 15 minutes and 30 days; longer ranges need the history endpoints."},{"name":"deep","in":"query","required":false,"schema":{"type":"boolean","description":"Measure `op_reply_rate`, which needs one extra upstream call per sampled post. Costs 25 credits instead of 10, and is available from the ultra plan up. When false, that one field is null with a stated reason and nothing else changes.","default":false,"title":"Deep"},"description":"Measure `op_reply_rate`, which needs one extra upstream call per sampled post. Costs 25 credits instead of 10, and is available from the ultra plan up. When false, that one field is null with a stated reason and nothing else changes."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubredditIntelligenceV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/post/{post_id}/conversation":{"get":{"tags":["intelligence"],"summary":"Analyse a conversation","description":"The shape of a discussion rather than the list of its comments: depth and branching, who took part, how fast replies arrived, how scores are distributed, how much was removed, which subthreads carried the thread and what it was actually about.\n\n`sample.coverage` compares what was returned against Reddit's own comment counter. It is routinely below 1.0 — Reddit counts removed comments it then declines to send — and `truncated_branches` marks the branches where replies exist that were not returned.","operationId":"analyze_conversation_v1_intelligence_post__post_id__conversation_get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":23,"description":"Post id, e.g. t3_1vekfof","title":"Post Id"},"description":"Post id, e.g. t3_1vekfof"},{"name":"sort","in":"query","required":false,"schema":{"$ref":"#/components/schemas/CommentSort","default":"best"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Comments requested upstream; a larger limit raises coverage","default":200,"title":"Limit"},"description":"Comments requested upstream; a larger limit raises coverage"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationIntelligenceV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/subreddit/{subreddit}/related":{"get":{"tags":["intelligence"],"summary":"Find related communities","description":"Communities close to this one, scored on several independent signals: topic similarity, shared link domains, aggregate audience overlap and cross-mentions.\n\n`similarity` is a weighted mean **of the signals that could be measured**, renormalised over those — a missing signal is never counted as a zero. `measured_signals` names the ones behind each score, so a 0.9 resting on topic similarity alone is visibly a weaker claim than a 0.7 resting on all four.\n\nAudience overlap is aggregate only, and is withheld when either community shows too few distinct authors for the figure to be about audiences rather than about identifiable people.","operationId":"related_subreddits_v1_intelligence_subreddit__subreddit__related_get","parameters":[{"name":"subreddit","in":"path","required":true,"schema":{"type":"string","minLength":2,"maxLength":24,"description":"Subreddit name","title":"Subreddit"},"description":"Subreddit name"},{"name":"window","in":"query","required":false,"schema":{"type":"string","description":"Period to summarise: a number followed by `m`, `h` or `d`. Between 15 minutes and 30 days; longer ranges need the history endpoints.","examples":["24h","7d","30d"],"default":"7d","title":"Window"},"description":"Period to summarise: a number followed by `m`, `h` or `d`. Between 15 minutes and 30 days; longer ranges need the history endpoints."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":12,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelatedSubredditsV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/trends":{"get":{"tags":["intelligence"],"summary":"Emerging topics across communities","description":"Topics rising across several communities at once, with the mentions, distinct authors and communities behind each.\n\n**Read `baseline.source` before reading `growth_ratio`.** The window is always measured live; the baseline comes from stored history where enough of it exists, and from the window's own older half where it does not. The two answer different questions — stored history says *unusual for this community*, a window split says only *rising within the window* — so a chart mixing them is comparing incomparable numbers. `baseline.history_depth_days` says how much series existed when this was computed.\n\nHistory accrues only for communities that have been analysed through this API; there is no backfill, because Reddit does not publish one. Asking about a community starts its series.\n\nA topic with no baseline has `growth_ratio: null` and `is_new: true`, and ranks below measured accelerations.","operationId":"trends_v1_intelligence_trends_get","parameters":[{"name":"subreddits","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":200,"description":"Comma-separated community names, up to 5","examples":["technology,programming,artificial"],"title":"Subreddits"},"description":"Comma-separated community names, up to 5"},{"name":"window","in":"query","required":false,"schema":{"type":"string","description":"Period measured live","default":"24h","title":"Window"},"description":"Period measured live"},{"name":"baseline","in":"query","required":false,"schema":{"type":"string","description":"Period to compare against","default":"30d","title":"Baseline"},"description":"Period to compare against"},{"name":"min_mentions","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Posts a topic needs before it is reported","default":10,"title":"Min Mentions"},"description":"Posts a topic needs before it is reported"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrendsV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/subreddits/compare":{"get":{"tags":["intelligence"],"summary":"Compare communities side by side","description":"Two to five communities over the same window, on the same metrics: activity, engagement, growth, posting rhythm, best hours to post, author concentration, dominant domains, flairs and topics.\n\nA community that could not be analysed — private, banned, misspelled — keeps its row with an `error` on it, so a failure is visible rather than returning fewer columns than were asked for. `leaders` names the community topping each metric, omitting metrics none could measure.","operationId":"compare_subreddits_v1_intelligence_subreddits_compare_get","parameters":[{"name":"names","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":200,"description":"Comma-separated community names, 2 to 5 of them","examples":["python,javascript,rust"],"title":"Names"},"description":"Comma-separated community names, 2 to 5 of them"},{"name":"window","in":"query","required":false,"schema":{"type":"string","description":"Period to summarise: a number followed by `m`, `h` or `d`. Between 15 minutes and 30 days; longer ranges need the history endpoints.","examples":["24h","7d","30d"],"default":"7d","title":"Window"},"description":"Period to summarise: a number followed by `m`, `h` or `d`. Between 15 minutes and 30 days; longer ranges need the history endpoints."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubredditComparisonV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/history/subreddit/{subreddit}":{"get":{"tags":["history"],"summary":"A community's stored series","description":"Hourly aggregate snapshots: subscribers, posting and comment rates, distinct posting authors, median score and comments, and the topics seen in each snapshot.\n\nHistory begins when a community is first analysed through this API — there is no backfill, because Reddit does not publish one. `depth` says how much series actually exists, and a baseline computed from less than the period you asked for is worth exactly what its depth says.","operationId":"subreddit_history_v1_history_subreddit__subreddit__get","parameters":[{"name":"subreddit","in":"path","required":true,"schema":{"type":"string","minLength":2,"maxLength":24,"description":"Subreddit name","title":"Subreddit"},"description":"Subreddit name"},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"description":"Days to look back. Defaults to your plan's maximum; asking for more than the plan allows is a 400 naming the limit.","title":"Days"},"description":"Days to look back. Defaults to your plan's maximum; asking for more than the plan allows is a 400 naming the limit."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistorySeriesV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/history/post/{post_id}":{"get":{"tags":["history"],"summary":"A post's score and comment trajectory","description":"How a post's score and comment count moved over time.\n\nOnly posts that were in a tracked community's sample at snapshot time have a series, so a post is covered from when it was first seen — never before. An empty `data` with a `depth` of zero means this post was never sampled, not that it had no engagement.\n\nHistory begins when a community is first analysed through this API — there is no backfill, because Reddit does not publish one. `depth` says how much series actually exists, and a baseline computed from less than the period you asked for is worth exactly what its depth says.","operationId":"post_history_v1_history_post__post_id__get","parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":23,"description":"Post id, e.g. t3_1vekfof","title":"Post Id"},"description":"Post id, e.g. t3_1vekfof"},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"description":"Days to look back. Defaults to your plan's maximum; asking for more than the plan allows is a 400 naming the limit.","title":"Days"},"description":"Days to look back. Defaults to your plan's maximum; asking for more than the plan allows is a 400 naming the limit."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistorySeriesV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/history/topic":{"get":{"tags":["history"],"summary":"A topic's stored series","description":"How often a phrase appeared, per snapshot, across the communities being tracked. Each point carries the community it came from, so a topic can be followed across communities without reading every community's own series.\n\nHistory begins when a community is first analysed through this API — there is no backfill, because Reddit does not publish one. `depth` says how much series actually exists, and a baseline computed from less than the period you asked for is worth exactly what its depth says.","operationId":"topic_history_v1_history_topic_get","parameters":[{"name":"topic","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":80,"description":"The exact topic phrase, as it appears in a trends response","examples":["local ai agents"],"title":"Topic"},"description":"The exact topic phrase, as it appears in a trends response"},{"name":"days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":365,"minimum":1},{"type":"null"}],"description":"Days to look back. Defaults to your plan's maximum; asking for more than the plan allows is a 400 naming the limit.","title":"Days"},"description":"Days to look back. Defaults to your plan's maximum; asking for more than the plan allows is a 400 naming the limit."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistorySeriesV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors":{"get":{"tags":["monitors"],"summary":"List your monitors","operationId":"list_monitors_v1_monitors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["monitors"],"summary":"Create a monitor","description":"A standing query that emits events when something matches.\n\n**Kinds.** `keyword` searches for a query, optionally within given communities. `subreddit_posts` fires on every new post in the listed communities. `score_threshold` fires when a post passes `threshold`. `topic_velocity` fires when a topic's growth ratio passes `threshold`.\n\nEvents carry a deterministic id derived from what they are about, so re-evaluation after a restart cannot re-send an alert. A monitor created today does not fire on a community's back catalogue.\n\nMonitors are included from the pro plan up; the number allowed comes from your plan.","operationId":"create_monitor_v1_monitors_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorCreateV1"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors/{monitor_id}":{"get":{"tags":["monitors"],"summary":"One monitor","operationId":"get_monitor_v1_monitors__monitor_id__get","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","minLength":8,"maxLength":32,"description":"Monitor id","title":"Monitor Id"},"description":"Monitor id"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["monitors"],"summary":"Update a monitor","description":"Set `active: false` to pause one without losing its cursor.","operationId":"update_monitor_v1_monitors__monitor_id__patch","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","minLength":8,"maxLength":32,"description":"Monitor id","title":"Monitor Id"},"description":"Monitor id"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorUpdateV1"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["monitors"],"summary":"Delete a monitor","description":"Removes the monitor, its events, its webhooks and its delivery log.","operationId":"delete_monitor_v1_monitors__monitor_id__delete","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","minLength":8,"maxLength":32,"description":"Monitor id","title":"Monitor Id"},"description":"Monitor id"}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors/{monitor_id}/events":{"get":{"tags":["monitors"],"summary":"Events a monitor has emitted","description":"Newest first. Events are a queue you drain, not an archive: the most recent few hundred are kept, for a week. Deduplicate on `id` — it is stable for a given match, and the same id is never delivered twice by the same monitor.","operationId":"monitor_events_v1_monitors__monitor_id__events_get","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","minLength":8,"maxLength":32,"description":"Monitor id","title":"Monitor Id"},"description":"Monitor id"},{"name":"since","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Unix time; only events after it","default":0,"title":"Since"},"description":"Unix time; only events after it"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonitorEventListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors/{monitor_id}/webhooks":{"post":{"tags":["monitors"],"summary":"Add a webhook","description":"Events are POSTed as JSON to `url`, signed with HMAC-SHA256.\n\n**The signing secret is returned exactly once — here. Store it now**; listing webhooks always returns `null` for it.\n\nEach delivery carries `X-ReddiGraph-Signature`, `X-ReddiGraph-Timestamp`, `X-ReddiGraph-Event-Id` and `X-ReddiGraph-Delivery-Id`. Verify by computing `HMAC-SHA256(secret, f\"{timestamp}.\" + raw_body)` and comparing in constant time; reject timestamps older than five minutes, which is what makes a captured delivery unreplayable. The Python SDK ships `verify()` so you do not have to reimplement it.\n\nAn endpoint that fails five consecutive deliveries is disabled with the reason recorded, rather than retried for ever.","operationId":"add_webhook_v1_monitors__monitor_id__webhooks_post","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","minLength":8,"maxLength":32,"description":"Monitor id","title":"Monitor Id"},"description":"Monitor id"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateV1"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["monitors"],"summary":"List webhooks","description":"`secret` is always null here — it is shown only at creation.","operationId":"list_webhooks_v1_monitors__monitor_id__webhooks_get","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","minLength":8,"maxLength":32,"description":"Monitor id","title":"Monitor Id"},"description":"Monitor id"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors/{monitor_id}/webhooks/{webhook_id}":{"delete":{"tags":["monitors"],"summary":"Remove a webhook","operationId":"delete_webhook_v1_monitors__monitor_id__webhooks__webhook_id__delete","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","minLength":8,"maxLength":32,"description":"Monitor id","title":"Monitor Id"},"description":"Monitor id"},{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","minLength":8,"maxLength":32,"title":"Webhook Id"}}],"responses":{"204":{"description":"Successful Response"},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitors/{monitor_id}/deliveries":{"get":{"tags":["monitors"],"summary":"Webhook delivery log","description":"Every attempt this monitor's webhooks have made, newest first, with the status or transport error. A webhook that silently fails is worse than no webhook — this is where you find out.","operationId":"monitor_deliveries_v1_monitors__monitor_id__deliveries_get","parameters":[{"name":"monitor_id","in":"path","required":true,"schema":{"type":"string","minLength":8,"maxLength":32,"description":"Monitor id","title":"Monitor Id"},"description":"Monitor id"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/exports":{"get":{"tags":["exports"],"summary":"List your exports","operationId":"list_exports_v1_exports_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportListV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["exports"],"summary":"Request an export","description":"Queues a dataset and answers `202` with a job. Poll `GET /v1/exports/{id}` until `status` is `completed`, then fetch `/download`.\n\n**Kinds**\n\n- `subreddit_posts` — Posts from one community over a window\n- `search_posts` — Posts matching a search query\n- `post_comments` — The comment tree of one post, flat and depth-first\n- `subreddit_history` — Stored aggregate snapshots of one community\n\n**Formats** — `jsonl`, `csv`, `parquet`. Parquet columns are all strings: typing them per kind would mean a column that is an integer in one export and null in the next changes type between files, which is worse for the warehouse consuming them.\n\n**Limits.** Exports are included from the pro plan up, with a daily count and a row ceiling per plan. When the ceiling bites, the job reports `rows` written, `rows_available` before truncation and `truncated: true` — it never silently returns a short file.\n\nThe download is available for 24 hours; the job record outlives it, so a caller who comes back too late gets an explanation rather than a bare 404.","operationId":"create_export_v1_exports_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportCreateV1"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/exports/{export_id}":{"get":{"tags":["exports"],"summary":"Export status","description":"`queued`, `running`, `completed`, `failed` or `expired`. A `failed` job carries `error`; an `expired` one means the file is gone but the record is not.","operationId":"export_status_v1_exports__export_id__get","parameters":[{"name":"export_id","in":"path","required":true,"schema":{"type":"string","minLength":8,"maxLength":32,"description":"Export id","title":"Export Id"},"description":"Export id"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/exports/{export_id}/download":{"get":{"tags":["exports"],"summary":"Download an export","description":"The file itself, or a `307` to a short-lived signed URL for it when the deployment stores exports in object storage — follow redirects, which most clients do by default. A job that is not `completed` answers `400` naming its status.","operationId":"download_export_v1_exports__export_id__download_get","parameters":[{"name":"export_id","in":"path","required":true,"schema":{"type":"string","minLength":8,"maxLength":32,"description":"Export id","title":"Export Id"},"description":"Export id"}],"responses":{"200":{"description":"The exported dataset","content":{"application/json":{"schema":{}},"application/x-ndjson":{},"text/csv":{},"application/vnd.apache.parquet":{}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"307":{"description":"A short-lived signed URL for the file in object storage. Follow it — most HTTP clients do by default. It is scoped to this one file and expires with the download window."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/resolve-url":{"get":{"tags":["meta"],"summary":"Resolve a Reddit URL","description":"Classify a Reddit URL and extract its ids without contacting Reddit. Accepts any `*.reddit.com` host and `redd.it` short links, with or without a scheme. Unrecognised URLs return `type: unknown` rather than an error.","operationId":"resolve_url_v1_resolve_url_get","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":2048,"description":"Reddit URL","title":"Url"},"description":"Reddit URL"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolvedUrlV1"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["meta"],"summary":"Service metadata","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Root  Get"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/health":{"get":{"tags":["meta"],"summary":"Health check","description":"Public liveness status, always HTTP 200 while the process answers. Dependency details are intentionally omitted. This is the endpoint a container healthcheck should probe, because restarting an instance cannot fix an upstream outage. Use `/ready` to decide whether an instance should receive traffic.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"`SESSION_AUTH_UNAVAILABLE` — The identity provider could not be reached, so the session could not be verified. Our fault, not yours. `BILLING_UNAVAILABLE` — Stripe could not be reached, so the checkout or portal session could not be created. `UPSTREAM_UNAVAILABLE` — The circuit breaker is open, or every credential in the pool is rate limited by Reddit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/ready":{"get":{"tags":["meta"],"summary":"Readiness check","description":"Traffic check for a load balancer: answers 503 when this instance cannot serve, i.e. its credential pool is empty or its circuit breaker is open. Dependency details are intentionally omitted from the public response.","operationId":"ready_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}},"400":{"description":"`INVALID_INPUT` — A parameter failed validation, or the request exceeded a limit of your plan. `INVALID_PLAN` — The requested plan is not one that can be bought. `WEBHOOK_SIGNATURE_INVALID` — A webhook payload did not carry a valid Stripe signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"`AUTH_MISSING` — The request carried no API key. `AUTH_INVALID` — The key is unknown, has been revoked, or belongs to a suspended account. `SESSION_AUTH_MISSING` — A dashboard request carried no session token. `SESSION_AUTH_INVALID` — The session token is expired, malformed, or was issued for another application.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Instance is not ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}},"403":{"description":"`EMAIL_NOT_VERIFIED` — The identity provider holds no verified email address for this sign-in, so no account could be created. `ACCOUNT_SUSPENDED` — The account is suspended and cannot issue keys or call the API. `PLAN_REQUIRED` — The operation exists but is not included in your plan — the intelligence endpoints, or `deep=true` on a plan below ultra.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`ACCOUNT_CONFLICT` — This email already belongs to an account linked to a different sign-in identity. `SUBSCRIPTION_CONFLICT` — The account already has an active subscription, or none to manage.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"`KEY_LIMIT_REACHED` — The account already holds every active API key its plan allows. `RATE_LIMITED` — You exceeded the requests-per-second quota of your plan. `MONTHLY_QUOTA_EXCEEDED` — You have used every request included in your plan for this calendar month. `CREDITS_EXHAUSTED` — You have too few upstream credits left for an operation this expensive. Requests are weighted by the upstream work they cause, and the budget covers a rolling 24 hours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`BILLING_DISABLED` — This deployment does not carry the billing routes. `NOT_FOUND` — The post, user, community or wiki page does not exist, is banned, or was deleted. `FEATURE_UNAVAILABLE` — The endpoint exists in this API but the deployment you are calling does not carry it — history, monitors or exports may be switched off, because each costs storage a given instance may not have.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"405":{"description":"`METHOD_NOT_ALLOWED` — The path exists but not for this HTTP method.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"`INTERNAL_ERROR` — A bug on our side. Never the caller's fault.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"`UPSTREAM_ERROR` — Reddit answered, but not with usable data — a GraphQL error, an empty root, or a payload that failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"`UPSTREAM_TIMEOUT` — The request exceeded its deadline, upstream or end to end.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"ActivityV1":{"properties":{"posts_per_hour":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Posts Per Hour"},"comments_per_hour":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Comments Per Hour"},"distinct_post_authors":{"type":"integer","title":"Distinct Post Authors","description":"Distinct authors who posted in the window. Not the community's active user count — commenters are not counted here.","default":0},"comments_per_post":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Comments Per Post"}},"type":"object","title":"ActivityV1"},"BatchPostsRequest":{"properties":{"ids":{"items":{"type":"string","maxLength":32,"minLength":1},"type":"array","maxItems":100,"minItems":1,"title":"Ids","description":"Post ids, `t3_xxxxxx` or bare `xxxxxx`. The hard ceiling is 100; your plan's own ceiling is lower unless you are on mega.","examples":[["t3_1vekfof","1ve4xsk"]]}},"type":"object","required":["ids"],"title":"BatchPostsRequest"},"BestHourV1":{"properties":{"hour_utc":{"type":"integer","title":"Hour Utc"},"posts":{"type":"integer","title":"Posts","default":0},"median_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Score"},"share_of_posts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Share Of Posts"}},"type":"object","required":["hour_utc"],"title":"BestHourV1"},"CommentListV1":{"properties":{"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After","description":"Cursor for the next page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"data":{"items":{"$ref":"#/components/schemas/CommentV1"},"type":"array","title":"Data"}},"type":"object","title":"CommentListV1"},"CommentSearchListV1":{"properties":{"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After","description":"Cursor for the next page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"data":{"items":{"$ref":"#/components/schemas/CommentSearchResultV1"},"type":"array","title":"Data"}},"type":"object","title":"CommentSearchListV1"},"CommentSearchResultV1":{"properties":{"id":{"type":"string","title":"Id","description":"Fullname, e.g. t1_p1ho81b"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"body":{"type":"string","title":"Body","default":""},"body_preview":{"type":"string","title":"Body Preview","default":""},"score":{"type":"integer","title":"Score","default":0},"created_utc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Utc"},"depth":{"type":"integer","title":"Depth","default":0},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"post_id":{"type":"string","title":"Post Id","default":""},"is_op":{"type":"boolean","title":"Is Op","default":false},"is_stickied":{"type":"boolean","title":"Is Stickied","default":false},"is_locked":{"type":"boolean","title":"Is Locked","default":false},"is_score_hidden":{"type":"boolean","title":"Is Score Hidden","default":false},"is_archived":{"type":"boolean","title":"Is Archived","default":false},"distinguished":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Distinguished"},"permalink":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink"},"replies":{"items":{"$ref":"#/components/schemas/CommentV1"},"type":"array","title":"Replies","description":"Always empty on flat list endpoints; use depth + parent_id"},"has_more":{"type":"boolean","title":"Has More","default":false},"post_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Title"},"post_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Url"}},"type":"object","required":["id"],"title":"CommentSearchResultV1","description":"A comment returned by search, with the post it belongs to.\n\nSearch returns comments flat and without their tree: `depth` is always 0,\n`replies` is always empty and `parent_id` falls back to the post."},"CommentSort":{"type":"string","enum":["best","top","new","controversial","old","qanda"],"title":"CommentSort"},"CommentV1":{"properties":{"id":{"type":"string","title":"Id","description":"Fullname, e.g. t1_p1ho81b"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"body":{"type":"string","title":"Body","default":""},"body_preview":{"type":"string","title":"Body Preview","default":""},"score":{"type":"integer","title":"Score","default":0},"created_utc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Utc"},"depth":{"type":"integer","title":"Depth","default":0},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"post_id":{"type":"string","title":"Post Id","default":""},"is_op":{"type":"boolean","title":"Is Op","default":false},"is_stickied":{"type":"boolean","title":"Is Stickied","default":false},"is_locked":{"type":"boolean","title":"Is Locked","default":false},"is_score_hidden":{"type":"boolean","title":"Is Score Hidden","default":false},"is_archived":{"type":"boolean","title":"Is Archived","default":false},"distinguished":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Distinguished"},"permalink":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink"},"replies":{"items":{"$ref":"#/components/schemas/CommentV1"},"type":"array","title":"Replies","description":"Always empty on flat list endpoints; use depth + parent_id"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["id"],"title":"CommentV1"},"ComparedSubredditV1":{"properties":{"subreddit":{"type":"string","title":"Subreddit"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"subscribers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Subscribers"},"sample":{"anyOf":[{"$ref":"#/components/schemas/SampleV1"},{"type":"null"}]},"activity":{"anyOf":[{"$ref":"#/components/schemas/ActivityV1"},{"type":"null"}]},"engagement":{"anyOf":[{"$ref":"#/components/schemas/EngagementV1"},{"type":"null"}]},"growth":{"anyOf":[{"$ref":"#/components/schemas/GrowthV1"},{"type":"null"}]},"rhythm":{"anyOf":[{"$ref":"#/components/schemas/RhythmV1"},{"type":"null"}]},"authorship":{"anyOf":[{"$ref":"#/components/schemas/ConcentrationV1"},{"type":"null"}]},"top_domains":{"items":{"$ref":"#/components/schemas/CountShareV1"},"type":"array","title":"Top Domains"},"top_flairs":{"items":{"$ref":"#/components/schemas/CountShareV1"},"type":"array","title":"Top Flairs"},"topics":{"items":{"type":"string"},"type":"array","title":"Topics"}},"type":"object","required":["subreddit"],"title":"ComparedSubredditV1","description":"One community's column in a comparison.\n\n`error` is non-null when that community could not be analysed — private,\nbanned, misspelled. The row stays in the response so the caller sees which\nname failed instead of silently receiving fewer columns than they asked for."},"ConcentrationV1":{"properties":{"contributors":{"type":"integer","title":"Contributors","default":0},"top_1_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Top 1 Share"},"top_10_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Top 10 Share"},"hhi":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hhi","description":"Herfindahl index: sum of squared shares. 1.0 is a single contributor, near 0 is evenly spread. Unlike a top-N share it does not depend on where the cutoff falls."}},"type":"object","title":"ConcentrationV1","description":"How concentrated contributions are among contributors."},"ContentV1":{"properties":{"top_domains":{"items":{"$ref":"#/components/schemas/CountShareV1"},"type":"array","title":"Top Domains"},"top_flairs":{"items":{"$ref":"#/components/schemas/CountShareV1"},"type":"array","title":"Top Flairs"},"self_post_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Self Post Share"},"topics":{"items":{"$ref":"#/components/schemas/TopicV1"},"type":"array","title":"Topics"},"emerging_topics":{"items":{"$ref":"#/components/schemas/EmergingTopicV1"},"type":"array","title":"Emerging Topics"}},"type":"object","title":"ContentV1"},"ConversationIntelligenceV1":{"properties":{"post_id":{"type":"string","title":"Post Id"},"subreddit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subreddit"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"created_utc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Utc"},"score":{"type":"integer","title":"Score","default":0},"generated_at":{"type":"string","title":"Generated At"},"comment_sort":{"type":"string","title":"Comment Sort"},"sample":{"$ref":"#/components/schemas/ConversationSampleV1"},"structure":{"$ref":"#/components/schemas/ConversationStructureV1"},"participation":{"$ref":"#/components/schemas/ParticipationV1"},"velocity":{"$ref":"#/components/schemas/VelocityV1"},"scores":{"$ref":"#/components/schemas/ScoreDistributionV1"},"moderation":{"$ref":"#/components/schemas/ModerationV1"},"subthreads":{"items":{"$ref":"#/components/schemas/SubthreadV1"},"type":"array","title":"Subthreads"},"topics":{"items":{"$ref":"#/components/schemas/ConversationTopicV1"},"type":"array","title":"Topics"}},"type":"object","required":["post_id","generated_at","comment_sort","sample","structure","participation","velocity","scores","moderation"],"title":"ConversationIntelligenceV1","description":"The shape of one discussion, rather than the list of its comments."},"ConversationSampleV1":{"properties":{"comments_observed":{"type":"integer","title":"Comments Observed","default":0},"comments_reported_by_reddit":{"type":"integer","title":"Comments Reported By Reddit","default":0},"coverage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Coverage","description":"Observed over reported. Routinely below 1.0: Reddit counts removed comments that its API then declines to send."},"truncated_branches":{"type":"integer","title":"Truncated Branches","description":"Branches flagged `has_more` — replies exist that were not returned","default":0}},"type":"object","title":"ConversationSampleV1"},"ConversationStructureV1":{"properties":{"unique_authors":{"type":"integer","title":"Unique Authors","default":0},"max_depth":{"type":"integer","title":"Max Depth","default":0},"top_level_comments":{"type":"integer","title":"Top Level Comments","default":0},"median_depth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Depth"},"branching_factor":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Branching Factor","description":"Average replies per comment that received any. Comments with no replies are excluded, so this describes shape rather than size."},"replies_per_author":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Replies Per Author"}},"type":"object","title":"ConversationStructureV1"},"ConversationTopicV1":{"properties":{"topic":{"type":"string","title":"Topic"},"comments":{"type":"integer","title":"Comments","default":0},"unique_authors":{"type":"integer","title":"Unique Authors","default":0},"share_of_comments":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Share Of Comments"}},"type":"object","required":["topic"],"title":"ConversationTopicV1"},"CountShareV1":{"properties":{"value":{"type":"string","title":"Value"},"count":{"type":"integer","title":"Count","default":0},"share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Share"}},"type":"object","required":["value"],"title":"CountShareV1"},"DeliveryListV1":{"properties":{"data":{"items":{"$ref":"#/components/schemas/DeliveryV1"},"type":"array","title":"Data"}},"type":"object","title":"DeliveryListV1"},"DeliveryV1":{"properties":{"delivery_id":{"type":"string","title":"Delivery Id"},"webhook_id":{"type":"string","title":"Webhook Id"},"event_id":{"type":"string","title":"Event Id"},"event_type":{"type":"string","title":"Event Type","default":""},"at":{"type":"number","title":"At"},"status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"succeeded":{"type":"boolean","title":"Succeeded","default":false},"attempt":{"type":"integer","title":"Attempt","default":1}},"type":"object","required":["delivery_id","webhook_id","event_id","at"],"title":"DeliveryV1"},"DiscoveryElementV1":{"properties":{"type":{"type":"string","title":"Type","description":"topic_group | taxonomy_topics | community_recommendations"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"scheme_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheme Name"},"topics":{"items":{"$ref":"#/components/schemas/DiscoveryTopicV1"},"type":"array","title":"Topics"},"communities":{"items":{"$ref":"#/components/schemas/SubredditV1"},"type":"array","title":"Communities"}},"type":"object","required":["type"],"title":"DiscoveryElementV1","description":"One block of Reddit's discovery surface. Never contains a post."},"DiscoveryTopicV1":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"type":"object","title":"DiscoveryTopicV1"},"DiscoveryV1":{"properties":{"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After","description":"Cursor for the next page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"data":{"items":{"$ref":"#/components/schemas/DiscoveryElementV1"},"type":"array","title":"Data"}},"type":"object","title":"DiscoveryV1"},"EmergingTopicV1":{"properties":{"topic":{"type":"string","title":"Topic"},"posts":{"type":"integer","title":"Posts","default":0},"baseline_posts":{"type":"integer","title":"Baseline Posts","default":0},"growth_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Growth Ratio","description":"Recent rate divided by baseline rate. Null when the topic is new, since there is no baseline to divide by — see `is_new`."},"is_new":{"type":"boolean","title":"Is New","default":false},"unique_authors":{"type":"integer","title":"Unique Authors","default":0},"representative_post_ids":{"items":{"type":"string"},"type":"array","title":"Representative Post Ids"}},"type":"object","required":["topic"],"title":"EmergingTopicV1"},"EngagementV1":{"properties":{"median_post_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Post Score"},"p90_post_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P90 Post Score","description":"Null below 5 posts, where a percentile is one observation"},"max_post_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Post Score"},"median_comments":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Comments"},"p90_comments":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P90 Comments"},"zero_comment_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zero Comment Share"},"median_upvote_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Upvote Ratio"},"op_reply_rate":{"$ref":"#/components/schemas/MeasuredRateV1"}},"type":"object","title":"EngagementV1"},"ErrorResponse":{"properties":{"error":{"type":"string","title":"Error"},"code":{"type":"string","title":"Code"},"details":{"additionalProperties":true,"type":"object","title":"Details"}},"type":"object","required":["error","code"],"title":"ErrorResponse"},"ExportCreateV1":{"properties":{"kind":{"type":"string","title":"Kind","description":"subreddit_posts | search_posts | post_comments | subreddit_history","examples":["subreddit_posts"]},"format":{"type":"string","title":"Format","description":"jsonl | csv | parquet","default":"jsonl"},"params":{"additionalProperties":true,"type":"object","title":"Params","description":"Kind-specific: `subreddit`, `query`, `post_id`, `sort`, `time`, `days`","examples":[{"sort":"new","subreddit":"python"}]}},"type":"object","required":["kind"],"title":"ExportCreateV1"},"ExportListV1":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ExportV1"},"type":"array","title":"Data"}},"type":"object","title":"ExportListV1"},"ExportSchemaV1":{"properties":{"columns":{"items":{"type":"string"},"type":"array","title":"Columns"},"format":{"type":"string","title":"Format","default":""}},"type":"object","title":"ExportSchemaV1"},"ExportV1":{"properties":{"id":{"type":"string","title":"Id"},"plan":{"type":"string","title":"Plan","default":""},"kind":{"type":"string","title":"Kind"},"format":{"type":"string","title":"Format"},"params":{"additionalProperties":true,"type":"object","title":"Params"},"status":{"type":"string","title":"Status","description":"queued | running | completed | failed | expired"},"created_at":{"type":"number","title":"Created At","default":0.0},"started_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Finished At"},"rows":{"type":"integer","title":"Rows","default":0},"rows_available":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rows Available","description":"Rows that existed before the plan's row ceiling applied"},"truncated":{"type":"boolean","title":"Truncated","description":"True when `rows_available` exceeded what was written","default":false},"bytes":{"type":"integer","title":"Bytes","default":0},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"download_expires_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Download Expires At"},"columns":{"items":{"type":"string"},"type":"array","title":"Columns"},"attempts":{"type":"integer","title":"Attempts","default":0},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url"},"schema":{"anyOf":[{"$ref":"#/components/schemas/ExportSchemaV1"},{"type":"null"}]}},"type":"object","required":["id","kind","format","status"],"title":"ExportV1"},"FeedSort":{"type":"string","enum":["hot","new","top","rising","controversial","best"],"title":"FeedSort"},"GalleryItemV1":{"properties":{"url":{"type":"string","title":"Url"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"}},"type":"object","required":["url"],"title":"GalleryItemV1"},"GrowthV1":{"properties":{"posts_growth_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Posts Growth Ratio"},"engagement_growth_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Engagement Growth Ratio"},"recent_posts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recent Posts"},"baseline_posts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Baseline Posts"},"measured":{"type":"boolean","title":"Measured","default":false},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"GrowthV1"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status"},"checks":{"additionalProperties":true,"type":"object","title":"Checks"},"timestamp":{"type":"string","title":"Timestamp"}},"type":"object","required":["status","checks","timestamp"],"title":"HealthResponse"},"HighlightListV1":{"properties":{"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After","description":"Cursor for the next page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"data":{"items":{"$ref":"#/components/schemas/HighlightedPostV1"},"type":"array","title":"Data"}},"type":"object","title":"HighlightListV1"},"HighlightedPostV1":{"properties":{"id":{"type":"string","title":"Id","description":"Fullname, e.g. t3_1vekfof"},"title":{"type":"string","title":"Title","default":""},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"subreddit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subreddit"},"subreddit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subreddit Id"},"score":{"type":"integer","title":"Score","default":0},"upvote_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Upvote Ratio"},"comment_count":{"type":"integer","title":"Comment Count","default":0},"created_utc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Utc"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"permalink":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink"},"selftext":{"type":"string","title":"Selftext","default":""},"is_nsfw":{"type":"boolean","title":"Is Nsfw","default":false},"is_spoiler":{"type":"boolean","title":"Is Spoiler","default":false},"is_locked":{"type":"boolean","title":"Is Locked","default":false},"is_archived":{"type":"boolean","title":"Is Archived","default":false},"is_stickied":{"type":"boolean","title":"Is Stickied","default":false},"is_original_content":{"type":"boolean","title":"Is Original Content","default":false},"is_video":{"type":"boolean","title":"Is Video","default":false},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"flair_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flair Text"},"media":{"anyOf":[{"$ref":"#/components/schemas/MediaV1"},{"type":"null"}]},"gallery":{"anyOf":[{"items":{"$ref":"#/components/schemas/GalleryItemV1"},"type":"array"},{"type":"null"}],"title":"Gallery"},"highlight_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Highlight Label","description":"Moderator label, e.g. `Weekly` — often absent"},"highlight_expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Highlight Expires At"}},"type":"object","required":["id"],"title":"HighlightedPostV1","description":"A post a moderator pinned to the top of the community.\n\nThe upstream payload for highlights is trimmed: `author`, `url` and\n`domain` are not returned by Reddit for these posts and stay null."},"HistoryDepthV1":{"properties":{"points":{"type":"integer","title":"Points","default":0},"oldest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oldest"},"newest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Newest"},"days":{"type":"number","title":"Days","default":0.0}},"type":"object","title":"HistoryDepthV1","description":"How much series exists, so a caller can judge what it supports."},"HistorySeriesV1":{"properties":{"kind":{"type":"string","title":"Kind","description":"subreddit | post | topic"},"identifier":{"type":"string","title":"Identifier"},"generated_at":{"type":"string","title":"Generated At"},"horizon_days":{"type":"integer","title":"Horizon Days","description":"How far back your plan may read, in days","default":0},"depth":{"$ref":"#/components/schemas/HistoryDepthV1"},"data":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Data","description":"Snapshots oldest first, each with `captured_at`. Aggregates only — no post or comment content is stored."}},"type":"object","required":["kind","identifier","generated_at","depth"],"title":"HistorySeriesV1"},"LeaderV1":{"properties":{"subreddit":{"type":"string","title":"Subreddit"},"value":{"type":"number","title":"Value"},"compared":{"type":"integer","title":"Compared","description":"How many communities could be measured on this metric","default":0}},"type":"object","required":["subreddit","value"],"title":"LeaderV1"},"MeasuredRateV1":{"properties":{"rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rate"},"posts_inspected":{"type":"integer","title":"Posts Inspected","default":0},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Why `rate` is null; null itself when the rate was measured"},"selection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selection","description":"How the inspected posts were chosen, and any bias that implies"}},"type":"object","title":"MeasuredRateV1","description":"A rate, the subsample behind it, and why it is missing when it is."},"MediaV1":{"properties":{"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type","description":"image | video | embed"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"embed_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Embed Url"}},"type":"object","title":"MediaV1"},"ModerationV1":{"properties":{"removed_or_deleted":{"type":"integer","title":"Removed Or Deleted","default":0},"removed_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Removed Share"}},"type":"object","title":"ModerationV1"},"MonitorCreateV1":{"properties":{"kind":{"type":"string","title":"Kind","description":"keyword | subreddit_posts | score_threshold | topic_velocity","examples":["keyword"]},"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name","description":"A name you will recognise in an alert months from now"},"subreddits":{"items":{"type":"string","maxLength":24,"minLength":2},"type":"array","maxItems":10,"title":"Subreddits"},"query":{"type":"string","maxLength":500,"title":"Query","default":""},"threshold":{"type":"number","title":"Threshold","description":"A score for `score_threshold`, a growth ratio for `topic_velocity`","default":0.0}},"type":"object","required":["kind","name"],"title":"MonitorCreateV1"},"MonitorEventListV1":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MonitorEventV1"},"type":"array","title":"Data"}},"type":"object","title":"MonitorEventListV1"},"MonitorEventV1":{"properties":{"id":{"type":"string","title":"Id","description":"Deterministic, derived from what the event is about. Re-evaluating the same window produces the same id, so a restart cannot re-send an alert. Use it to deduplicate on your side too."},"type":{"type":"string","title":"Type","description":"post.matched | topic.emerging | monitor.failed | …"},"monitor_id":{"type":"string","title":"Monitor Id"},"monitor_name":{"type":"string","title":"Monitor Name","default":""},"at":{"type":"number","title":"At"},"reason":{"type":"string","title":"Reason","default":""},"subject":{"additionalProperties":true,"type":"object","title":"Subject","description":"What the event is about; shape depends on `type`"}},"type":"object","required":["id","type","monitor_id","at"],"title":"MonitorEventV1"},"MonitorListV1":{"properties":{"data":{"items":{"$ref":"#/components/schemas/MonitorV1"},"type":"array","title":"Data"}},"type":"object","title":"MonitorListV1"},"MonitorUpdateV1":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Name"},"subreddits":{"anyOf":[{"items":{"type":"string","maxLength":24,"minLength":2},"type":"array"},{"type":"null"}],"title":"Subreddits"},"query":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Query"},"threshold":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}},"type":"object","title":"MonitorUpdateV1"},"MonitorV1":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"type":"string","title":"Kind"},"name":{"type":"string","title":"Name"},"subreddits":{"items":{"type":"string"},"type":"array","title":"Subreddits"},"query":{"type":"string","title":"Query","default":""},"threshold":{"type":"number","title":"Threshold","default":0.0},"created_at":{"type":"number","title":"Created At","default":0.0},"last_evaluated_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Evaluated At"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"active":{"type":"boolean","title":"Active","default":true},"events_emitted":{"type":"integer","title":"Events Emitted","default":0}},"type":"object","required":["id","kind","name"],"title":"MonitorV1"},"ParticipationV1":{"properties":{"op":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Op"},"op_comments":{"type":"integer","title":"Op Comments","default":0},"op_replied":{"type":"boolean","title":"Op Replied","default":false},"op_share_of_comments":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Op Share Of Comments"},"moderator_comments":{"type":"integer","title":"Moderator Comments","default":0},"moderator_present":{"type":"boolean","title":"Moderator Present","default":false},"concentration":{"$ref":"#/components/schemas/ConcentrationV1"}},"type":"object","title":"ParticipationV1"},"PopularSort":{"type":"string","enum":["best","hot","new","top"],"title":"PopularSort"},"PostListV1":{"properties":{"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After","description":"Cursor for the next page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"data":{"items":{"$ref":"#/components/schemas/PostV1"},"type":"array","title":"Data"}},"type":"object","title":"PostListV1"},"PostV1":{"properties":{"id":{"type":"string","title":"Id","description":"Fullname, e.g. t3_1vekfof"},"title":{"type":"string","title":"Title","default":""},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"subreddit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subreddit"},"subreddit_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subreddit Id"},"score":{"type":"integer","title":"Score","default":0},"upvote_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Upvote Ratio"},"comment_count":{"type":"integer","title":"Comment Count","default":0},"created_utc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Utc"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"permalink":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink"},"selftext":{"type":"string","title":"Selftext","default":""},"is_nsfw":{"type":"boolean","title":"Is Nsfw","default":false},"is_spoiler":{"type":"boolean","title":"Is Spoiler","default":false},"is_locked":{"type":"boolean","title":"Is Locked","default":false},"is_archived":{"type":"boolean","title":"Is Archived","default":false},"is_stickied":{"type":"boolean","title":"Is Stickied","default":false},"is_original_content":{"type":"boolean","title":"Is Original Content","default":false},"is_video":{"type":"boolean","title":"Is Video","default":false},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"flair_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flair Text"},"media":{"anyOf":[{"$ref":"#/components/schemas/MediaV1"},{"type":"null"}]},"gallery":{"anyOf":[{"items":{"$ref":"#/components/schemas/GalleryItemV1"},"type":"array"},{"type":"null"}],"title":"Gallery"}},"type":"object","required":["id"],"title":"PostV1"},"RelatedSubredditV1":{"properties":{"subreddit":{"type":"string","title":"Subreddit"},"similarity":{"type":"number","title":"Similarity","description":"Weighted mean of the measured signals, renormalised over them. A missing signal is never counted as zero — check `measured_signals`."},"signals":{"$ref":"#/components/schemas/SimilaritySignalsV1"},"measured_signals":{"items":{"type":"string"},"type":"array","title":"Measured Signals"},"sample":{"$ref":"#/components/schemas/SampleV1"}},"type":"object","required":["subreddit","similarity","signals","sample"],"title":"RelatedSubredditV1"},"RelatedSubredditsV1":{"properties":{"subreddit":{"type":"string","title":"Subreddit"},"window":{"type":"string","title":"Window"},"generated_at":{"type":"string","title":"Generated At"},"sample":{"$ref":"#/components/schemas/SampleV1"},"data":{"items":{"$ref":"#/components/schemas/RelatedSubredditV1"},"type":"array","title":"Data"},"method":{"type":"string","title":"Method","default":""}},"type":"object","required":["subreddit","window","generated_at","sample"],"title":"RelatedSubredditsV1"},"ResolvedUrlV1":{"properties":{"type":{"type":"string","title":"Type","description":"subreddit | post | comment | user | unknown"},"subreddit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subreddit"},"post_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Id"},"comment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment Id"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"}},"type":"object","required":["type"],"title":"ResolvedUrlV1"},"RhythmV1":{"properties":{"posts_by_hour_utc":{"items":{"type":"integer"},"type":"array","title":"Posts By Hour Utc","description":"24 buckets, index 0 = 00:00 UTC"},"best_hours_utc":{"items":{"$ref":"#/components/schemas/BestHourV1"},"type":"array","title":"Best Hours Utc","description":"Hours with the best median score, excluding hours with under 3 posts"},"measured_on":{"type":"integer","title":"Measured On","default":0}},"type":"object","title":"RhythmV1"},"RuleListV1":{"properties":{"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After","description":"Cursor for the next page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"data":{"items":{"$ref":"#/components/schemas/RuleV1"},"type":"array","title":"Data"}},"type":"object","title":"RuleListV1"},"RuleV1":{"properties":{"rule_number":{"type":"integer","title":"Rule Number","description":"1-based position in the list"},"rule_text":{"type":"string","title":"Rule Text","description":"Full rule body"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Short title shown in report flows"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","description":"What the rule applies to: LINK, COMMENT, LINK_AND_COMMENT"},"violation_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Violation Reason"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority","description":"Moderator-chosen ordering, 0-based"}},"type":"object","required":["rule_number","rule_text"],"title":"RuleV1","description":"A community rule.\n\n`rule_number` and `rule_text` are always present. The remaining fields come\nfrom Reddit's structured rules and are null only for the rare community\nwhose rules had to be recovered from its sidebar markdown instead."},"SampleV1":{"properties":{"posts":{"type":"integer","title":"Posts","description":"Posts observed inside the window","default":0},"comments_reported":{"type":"integer","title":"Comments Reported","description":"Sum of Reddit's own comment counters across those posts. Not the number of comments fetched — no comment was read to produce it.","default":0},"coverage":{"type":"number","title":"Coverage","description":"Fraction of the window the sample reaches back over. Below 1.0 the sampler ran out of page budget before the window's start, so the oldest part of the window is not represented.","default":0.0},"pages_fetched":{"type":"integer","title":"Pages Fetched","default":0},"complete":{"type":"boolean","title":"Complete","description":"True when sampling stopped because it passed the window's start, rather than because it hit its page or time budget.","default":false},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"posts_inspected_for_comments":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Posts Inspected For Comments","description":"Posts whose comment threads were read, if any"},"candidates_considered":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Candidates Considered"}},"type":"object","title":"SampleV1","description":"What was actually observed, behind every metric in the response."},"ScoreDistributionV1":{"properties":{"median":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median"},"p90":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P90"},"max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max"},"negative_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Negative Share"},"zero_or_one_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zero Or One Share"}},"type":"object","title":"ScoreDistributionV1"},"SearchSort":{"type":"string","enum":["relevance","hot","new","top","comments","controversial"],"title":"SearchSort"},"SharedTopicV1":{"properties":{"topic":{"type":"string","title":"Topic"},"subreddits":{"items":{"type":"string"},"type":"array","title":"Subreddits"},"communities":{"type":"integer","title":"Communities","default":0}},"type":"object","required":["topic"],"title":"SharedTopicV1"},"SimilaritySignalsV1":{"properties":{"topic_similarity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Topic Similarity"},"domain_overlap":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Domain Overlap"},"audience_overlap":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Audience Overlap","description":"Aggregate Jaccard overlap of post authors. Withheld — null, with a reason — when either community shows too few distinct authors for an overlap figure to be about audiences rather than people."},"audience_overlap_withheld_because":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience Overlap Withheld Because"},"mention_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mention Rate"},"mentions":{"type":"integer","title":"Mentions","default":0}},"type":"object","title":"SimilaritySignalsV1"},"SubredditComparisonV1":{"properties":{"window":{"type":"string","title":"Window"},"generated_at":{"type":"string","title":"Generated At"},"data":{"items":{"$ref":"#/components/schemas/ComparedSubredditV1"},"type":"array","title":"Data"},"shared_topics":{"items":{"$ref":"#/components/schemas/SharedTopicV1"},"type":"array","title":"Shared Topics"},"leaders":{"additionalProperties":{"$ref":"#/components/schemas/LeaderV1"},"type":"object","title":"Leaders","description":"Metric name -> the community that leads it, where measurable"}},"type":"object","required":["window","generated_at"],"title":"SubredditComparisonV1"},"SubredditIntelligenceV1":{"properties":{"subreddit":{"type":"string","title":"Subreddit"},"window":{"type":"string","title":"Window"},"generated_at":{"type":"string","title":"Generated At"},"subscribers":{"type":"integer","title":"Subscribers","default":0},"sample":{"$ref":"#/components/schemas/SampleV1"},"activity":{"$ref":"#/components/schemas/ActivityV1"},"engagement":{"$ref":"#/components/schemas/EngagementV1"},"content":{"$ref":"#/components/schemas/ContentV1"},"rhythm":{"$ref":"#/components/schemas/RhythmV1"},"authorship":{"$ref":"#/components/schemas/ConcentrationV1"},"growth":{"$ref":"#/components/schemas/GrowthV1"},"baseline":{"type":"string","title":"Baseline","description":"What the growth and emergence figures were compared against","default":""}},"type":"object","required":["subreddit","window","generated_at","sample","activity","engagement","content","rhythm","authorship","growth"],"title":"SubredditIntelligenceV1","description":"Everything one call replaces: a week of a community, summarised."},"SubredditSearchListV1":{"properties":{"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After","description":"Cursor for the next page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"data":{"items":{"$ref":"#/components/schemas/SubredditSearchResultV1"},"type":"array","title":"Data"}},"type":"object","title":"SubredditSearchListV1"},"SubredditSearchResultV1":{"properties":{"id":{"type":"string","title":"Id","default":""},"name":{"type":"string","title":"Name","default":""},"prefixed_name":{"type":"string","title":"Prefixed Name","description":"Not returned by community search — always the default here. Fetch `GET /v1/r/{subreddit}/about` for the real value.","default":""},"title":{"type":"string","title":"Title","description":"Not returned by community search — always the default here. Fetch `GET /v1/r/{subreddit}/about` for the real value.","default":""},"description":{"type":"string","title":"Description","description":"Not returned by community search — always the default here. Fetch `GET /v1/r/{subreddit}/about` for the real value.","default":""},"public_description":{"type":"string","title":"Public Description","default":""},"subscribers":{"type":"integer","title":"Subscribers","default":0},"active_users":{"type":"integer","title":"Active Users","default":0},"created_utc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Utc","description":"Not returned by community search — always the default here. Fetch `GET /v1/r/{subreddit}/about` for the real value."},"type":{"type":"string","title":"Type","description":"Not returned by community search — always the default here. Fetch `GET /v1/r/{subreddit}/about` for the real value.","default":""},"is_nsfw":{"type":"boolean","title":"Is Nsfw","default":false},"is_quarantined":{"type":"boolean","title":"Is Quarantined","default":false},"is_posting_restricted":{"type":"boolean","title":"Is Posting Restricted","default":false},"is_commenting_restricted":{"type":"boolean","title":"Is Commenting Restricted","default":false},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url"},"primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Color"},"banner_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Url"},"submit_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submit Text","description":"Not returned by community search — always the default here. Fetch `GET /v1/r/{subreddit}/about` for the real value."}},"type":"object","title":"SubredditSearchResultV1","description":"A community as returned by `GET /v1/search/subreddits`.\n\nTrimmed the same way the people pane is; see :class:`UserSearchResultV1`."},"SubredditStyleV1":{"properties":{"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url"},"banner_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Url"},"mobile_banner_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mobile Banner Url"},"banner_position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Position"},"banner_background_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Background Color"},"background_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Background Color"},"primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Color"},"highlight_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Highlight Color"},"upvote_icon_active":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upvote Icon Active"},"upvote_icon_inactive":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upvote Icon Inactive"},"downvote_icon_active":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Downvote Icon Active"},"downvote_icon_inactive":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Downvote Icon Inactive"},"upvote_count_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upvote Count Color"},"downvote_count_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Downvote Count Color"},"post_placeholder_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Post Placeholder Image"}},"type":"object","title":"SubredditStyleV1","description":"Visual customisation. Every field but `icon_url` is usually null."},"SubredditStylesV1":{"properties":{"subreddit":{"type":"string","title":"Subreddit","default":""},"styles":{"$ref":"#/components/schemas/SubredditStyleV1"},"rules":{"items":{"$ref":"#/components/schemas/RuleV1"},"type":"array","title":"Rules"},"widgets":{"additionalProperties":true,"type":"object","title":"Widgets","description":"Sidebar and topbar widget layout, passed through unnormalised"}},"type":"object","title":"SubredditStylesV1"},"SubredditV1":{"properties":{"id":{"type":"string","title":"Id","default":""},"name":{"type":"string","title":"Name","default":""},"prefixed_name":{"type":"string","title":"Prefixed Name","default":""},"title":{"type":"string","title":"Title","default":""},"description":{"type":"string","title":"Description","default":""},"public_description":{"type":"string","title":"Public Description","default":""},"subscribers":{"type":"integer","title":"Subscribers","default":0},"active_users":{"type":"integer","title":"Active Users","default":0},"created_utc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Utc"},"type":{"type":"string","title":"Type","default":""},"is_nsfw":{"type":"boolean","title":"Is Nsfw","default":false},"is_quarantined":{"type":"boolean","title":"Is Quarantined","default":false},"is_posting_restricted":{"type":"boolean","title":"Is Posting Restricted","default":false},"is_commenting_restricted":{"type":"boolean","title":"Is Commenting Restricted","default":false},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url"},"primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Color"},"banner_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Banner Url"},"submit_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submit Text"}},"type":"object","title":"SubredditV1"},"SubthreadV1":{"properties":{"root_comment_id":{"type":"string","title":"Root Comment Id"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"excerpt":{"type":"string","title":"Excerpt","default":""},"score":{"type":"integer","title":"Score","default":0},"comments":{"type":"integer","title":"Comments","default":0},"unique_authors":{"type":"integer","title":"Unique Authors","default":0},"share_of_thread":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Share Of Thread"}},"type":"object","required":["root_comment_id"],"title":"SubthreadV1"},"TaxonomyListV1":{"properties":{"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After","description":"Cursor for the next page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"data":{"items":{"$ref":"#/components/schemas/TaxonomyTopicV1"},"type":"array","title":"Data"}},"type":"object","title":"TaxonomyListV1"},"TaxonomyTopicV1":{"properties":{"topic_id":{"type":"string","title":"Topic Id"},"display_name":{"type":"string","title":"Display Name"},"display_copy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Copy","description":"Ranking blurb, e.g. `#1 in Tech News & Discussion`"}},"type":"object","required":["topic_id","display_name"],"title":"TaxonomyTopicV1"},"TimeRange":{"type":"string","enum":["hour","day","week","month","year","all"],"title":"TimeRange"},"TopicV1":{"properties":{"topic":{"type":"string","title":"Topic"},"posts":{"type":"integer","title":"Posts","default":0},"unique_authors":{"type":"integer","title":"Unique Authors","description":"Distinct authors who used the phrase — one person is not a trend","default":0},"share_of_posts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Share Of Posts"},"representative_post_ids":{"items":{"type":"string"},"type":"array","title":"Representative Post Ids"}},"type":"object","required":["topic"],"title":"TopicV1"},"TrendBaselineV1":{"properties":{"requested":{"type":"string","title":"Requested","description":"Baseline period the caller asked for"},"source":{"type":"string","title":"Source","description":"stored_history | window_split | window_split_insufficient_history"},"history_depth_days":{"type":"number","title":"History Depth Days","description":"Days of stored history behind the thinnest community","default":0.0},"description":{"type":"string","title":"Description","default":""}},"type":"object","required":["requested","source"],"title":"TrendBaselineV1","description":"Where the comparison came from — the field that makes growth meaningful.\n\n`source` is not decoration. `stored_history` answers \"unusual for this\ncommunity\"; a window split answers only \"rising within the window\". A\nclient charting growth over time must not mix the two, so the response\nalways says which it got and how much history existed when it was computed."},"TrendV1":{"properties":{"topic":{"type":"string","title":"Topic"},"mentions":{"type":"integer","title":"Mentions","default":0},"baseline_mentions":{"type":"number","title":"Baseline Mentions","default":0.0},"growth_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Growth Ratio","description":"Null when the topic is new — see `is_new`"},"is_new":{"type":"boolean","title":"Is New","default":false},"unique_authors":{"type":"integer","title":"Unique Authors","default":0},"communities":{"items":{"type":"string"},"type":"array","title":"Communities"},"representative_post_ids":{"items":{"type":"string"},"type":"array","title":"Representative Post Ids"}},"type":"object","required":["topic"],"title":"TrendV1"},"TrendingListV1":{"properties":{"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After","description":"Cursor for the next page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"data":{"items":{"$ref":"#/components/schemas/TrendingSearchV1"},"type":"array","title":"Data"}},"type":"object","title":"TrendingListV1"},"TrendingSearchV1":{"properties":{"query":{"type":"string","title":"Query"},"is_promoted":{"type":"boolean","title":"Is Promoted","default":false}},"type":"object","required":["query"],"title":"TrendingSearchV1"},"TrendsV1":{"properties":{"window":{"type":"string","title":"Window"},"generated_at":{"type":"string","title":"Generated At"},"subreddits":{"items":{"type":"string"},"type":"array","title":"Subreddits"},"unavailable":{"items":{"type":"string"},"type":"array","title":"Unavailable","description":"Requested communities that had no posts or could not be read"},"min_mentions":{"type":"integer","title":"Min Mentions","default":0},"sample":{"$ref":"#/components/schemas/SampleV1"},"baseline":{"$ref":"#/components/schemas/TrendBaselineV1"},"data":{"items":{"$ref":"#/components/schemas/TrendV1"},"type":"array","title":"Data"}},"type":"object","required":["window","generated_at","sample","baseline"],"title":"TrendsV1"},"TrophyListV1":{"properties":{"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After","description":"Cursor for the next page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"data":{"items":{"$ref":"#/components/schemas/TrophyV1"},"type":"array","title":"Data"}},"type":"object","title":"TrophyListV1"},"TrophyV1":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name","default":""},"icon_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon Url"},"is_repeatable":{"type":"boolean","title":"Is Repeatable","default":false},"count":{"type":"integer","title":"Count","description":"Times earned; always 1 when not repeatable","default":1}},"type":"object","required":["id"],"title":"TrophyV1"},"UserSearchListV1":{"properties":{"after":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"After","description":"Cursor for the next page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"data":{"items":{"$ref":"#/components/schemas/UserSearchResultV1"},"type":"array","title":"Data"}},"type":"object","title":"UserSearchListV1"},"UserSearchResultV1":{"properties":{"username":{"type":"string","title":"Username"},"id":{"type":"string","title":"Id","default":""},"karma_total":{"type":"integer","title":"Karma Total","default":0},"karma_comments":{"type":"integer","title":"Karma Comments","description":"Not returned by people search — always the default here. Fetch `GET /v1/user/{username}` for the real value.","default":0},"karma_posts":{"type":"integer","title":"Karma Posts","description":"Not returned by people search — always the default here. Fetch `GET /v1/user/{username}` for the real value.","default":0},"account_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Type","description":"Not returned by people search — always the default here. Fetch `GET /v1/user/{username}` for the real value."},"is_verified":{"type":"boolean","title":"Is Verified","description":"Not returned by people search — always the default here. Fetch `GET /v1/user/{username}` for the real value.","default":false},"is_premium":{"type":"boolean","title":"Is Premium","description":"Not returned by people search — always the default here. Fetch `GET /v1/user/{username}` for the real value.","default":false},"is_employee":{"type":"boolean","title":"Is Employee","description":"Not returned by people search — always the default here. Fetch `GET /v1/user/{username}` for the real value.","default":false},"is_accepting_followers":{"type":"boolean","title":"Is Accepting Followers","description":"Not returned by people search — always the default here. Fetch `GET /v1/user/{username}` for the real value.","default":false},"cake_day":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cake Day","description":"Not returned by people search — always the default here. Fetch `GET /v1/user/{username}` for the real value."},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"profile_is_nsfw":{"type":"boolean","title":"Profile Is Nsfw","description":"Not returned by people search — always the default here. Fetch `GET /v1/user/{username}` for the real value.","default":false},"created_utc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Utc","description":"Not returned by people search — always the default here. Fetch `GET /v1/user/{username}` for the real value."}},"type":"object","required":["username"],"title":"UserSearchResultV1","description":"A user as returned by `GET /v1/search/users`.\n\nReddit's people pane answers with a trimmed profile rather than a different\nshape: the fields it omits arrive as schema defaults, indistinguishable\nfrom a genuine `false` or `null`. They are redeclared below so the contract\nitself says which values cannot be trusted."},"UserSort":{"type":"string","enum":["new","hot","top","controversial"],"title":"UserSort"},"UserV1":{"properties":{"username":{"type":"string","title":"Username"},"id":{"type":"string","title":"Id","default":""},"karma_total":{"type":"integer","title":"Karma Total","default":0},"karma_comments":{"type":"integer","title":"Karma Comments","default":0},"karma_posts":{"type":"integer","title":"Karma Posts","default":0},"account_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Type"},"is_verified":{"type":"boolean","title":"Is Verified","default":false},"is_premium":{"type":"boolean","title":"Is Premium","default":false},"is_employee":{"type":"boolean","title":"Is Employee","default":false},"is_accepting_followers":{"type":"boolean","title":"Is Accepting Followers","default":false},"cake_day":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cake Day"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"profile_is_nsfw":{"type":"boolean","title":"Profile Is Nsfw","default":false},"created_utc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created Utc"}},"type":"object","required":["username"],"title":"UserV1"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VelocityV1":{"properties":{"median_seconds_to_comment":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Median Seconds To Comment"},"first_hour_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"First Hour Share"},"first_day_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"First Day Share"},"measured_on":{"type":"integer","title":"Measured On","default":0}},"type":"object","title":"VelocityV1"},"WebhookCreateV1":{"properties":{"url":{"type":"string","maxLength":2048,"minLength":8,"title":"Url","description":"HTTPS endpoint to POST events to","examples":["https://example.com/hook"]}},"type":"object","required":["url"],"title":"WebhookCreateV1"},"WebhookListV1":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WebhookV1"},"type":"array","title":"Data"}},"type":"object","title":"WebhookListV1"},"WebhookV1":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url"},"created_at":{"type":"number","title":"Created At"},"failures":{"type":"integer","title":"Failures","default":0},"disabled":{"type":"boolean","title":"Disabled","default":false},"disabled_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disabled Reason"},"last_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Status"},"last_attempt_at":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Attempt At"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret","description":"The signing secret, **returned only when the webhook is created**. It is never shown again — store it now. Listing a webhook always returns null here."}},"type":"object","required":["id","url","created_at"],"title":"WebhookV1"},"WikiPageV1":{"properties":{"subreddit":{"type":"string","title":"Subreddit","default":""},"name":{"type":"string","title":"Name","default":""},"content":{"type":"string","title":"Content","description":"Plain text rendered from the page's richtext document","default":""},"richtext":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Richtext","description":"Reddit's richtext document, as the raw JSON string"},"revised_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revised At"},"revised_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revised By"}},"type":"object","title":"WikiPageV1"}}}}