{"openapi":"3.1.0","jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","info":{"title":"US Top 8 Public Article API","version":"1.1.0","description":"Read-only access to published US Top 8 article metadata and the same prepared HTML displayed on the website. API major version 1 is current, uses /api/v1/ paths, and is identified by the X-API-Version: 1 response header. Backward-compatible additions may be introduced within v1; breaking contract changes will use a new major version path instead of replacing v1 behavior. Deprecation policy: current status and future retirement announcements are published at https://www.ustop8.com/docs/#versioning-and-retirement-policy and linked from API responses with rel=\"deprecation\". No endpoints are currently deprecated and no retirement date is scheduled. A scheduled retirement will identify the affected major version and its retirement date in that policy; deprecated endpoints will use Deprecation and Sunset headers when applicable. Responses contain public editorial content only. No authentication is required. Missing product URLs remain omitted, including the seven unlinked competitors in the Buba comparison. Unknown or repeated query parameters return a 400 problem response. Offset and cursor pagination are supported; do not combine offset with cursor. When the Cloudflare article rate-limit binding is configured, article GET/HEAD requests are limited approximately to 120 reads per 60 seconds per hashed client IP at each edge location, with 429 and Retry-After: 60 on exhaustion. Rate-policy headers are absent in environments without the binding. This API does not provide account actions, publishing, payments, asynchronous jobs, or other mutations."},"servers":[{"url":"https://www.ustop8.com","description":"Canonical production website and API."}],"tags":[{"name":"Articles","description":"Discover and read published comparison articles."},{"name":"Discovery","description":"Machine-readable API description."}],"security":[],"paths":{"/api/v1/articles/":{"get":{"operationId":"listArticles","tags":["Articles"],"summary":"List or search published articles","description":"Returns bounded article metadata, ordered newest first. Filters are combined. Use nextOffset with offset, or use nextCursor with cursor and the same q/category filters. A null continuation means the end of the current results. The response offset reports the current position for either pagination mode. Cursors resume after a stable article slug rather than a numeric position, so newly added articles ahead of that slug do not cause duplicates. Results are not a snapshot: edits or removals may change the remaining list, and a removed anchor returns 400. Empty searches and pages beyond the last result are successful responses with no items. Article HTML is available from the detail endpoint.","parameters":[{"name":"q","in":"query","description":"Case-insensitive substring search across published article titles and content. Whitespace is trimmed; at most 200 Unicode characters remain. Omit or leave empty to list all matching articles.","schema":{"type":"string","maxLength":200},"example":"StarRocks"},{"name":"limit","in":"query","description":"Maximum number of article metadata records returned.","schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"example":10},{"name":"offset","in":"query","description":"Zero-based offset into the filtered, newest-first results. Offsets beyond the result count return an empty page. Omit when using cursor; sending both returns 400.","schema":{"type":"integer","minimum":0,"maximum":9007199254740991,"default":0},"example":0},{"name":"cursor","in":"query","description":"Opaque nextCursor from a previous response. Continues after that page’s last article using its stable slug, with the same normalized q/category filters. Omit offset; limit may change. Malformed, mismatched-filter, or missing-anchor cursors return 400 invalid_query. Tokens have no time-based expiry and are not credentials; an article removal can invalidate one. New articles ahead of the anchor do not repeat earlier results.","schema":{"type":"string","minLength":1,"maxLength":4096,"pattern":"^[A-Za-z0-9_-]+$"},"example":"eyJ2IjoxLCJhZnRlciI6ImJlc3Qtc29jaWFsLW1lZGlhLXNjaGVkdWxpbmctdG9vbHMtdXMiLCJxIjoiIiwiY2F0ZWdvcnkiOm51bGx9"},{"name":"category","in":"query","description":"Filter by an existing public category slug. Input is trimmed and lowercased; known categories without articles return an empty page.","schema":{"type":"string","enum":["ai","ai-image-generator","ai-search","hr-platform","saas","startup","technology","uncategorized","workspace"]},"example":"technology"}],"security":[],"responses":{"200":{"description":"A page of matching public articles with offset and cursor continuations.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Link":{"$ref":"#/components/headers/OpenApiLink"},"X-API-Version":{"$ref":"#/components/headers/ApiVersion"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"},"RateLimit-Policy":{"description":"When the Cloudflare article rate-limit binding is configured, the approximate policy is 120 article GET/HEAD requests per 60 seconds per hashed client IP at an edge location. Absent in environments without the binding.","schema":{"type":"string"},"example":"120;w=60"},"RateLimit-Limit":{"description":"Configured request limit when the Cloudflare article rate-limit binding is active.","schema":{"type":"integer","minimum":1},"example":"120"},"RateLimit-Reset":{"description":"Conservative retry window in seconds when the Cloudflare article rate-limit binding is active; not an exact counter reset timestamp.","schema":{"type":"integer","minimum":1},"example":"60"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticlePage"},"examples":{"latest":{"summary":"First published article with next-page offset and cursor.","value":{"items":[{"slug":"best-social-media-scheduling-tools-us","title":"8 Best Social Media Scheduling Tools for U.S. Marketing Teams in 2026","path":"/best-social-media-scheduling-tools-us/","url":"https://www.ustop8.com/best-social-media-scheduling-tools-us/","description":"Compare igeo.ai and seven social media scheduling tools for U.S. marketing teams. Check current prices, approval workflows, account limits and publishing restrictions.","datePublished":"2026-10-22T06:06:41.000Z","dateModified":"2026-10-22T06:06:41.000Z","categories":[{"slug":"saas","name":"SaaS","path":"/category/saas/","url":"https://www.ustop8.com/category/saas/"}]}],"total":9,"limit":1,"offset":0,"nextOffset":1,"nextCursor":"eyJ2IjoxLCJhZnRlciI6ImJlc3Qtc29jaWFsLW1lZGlhLXNjaGVkdWxpbmctdG9vbHMtdXMiLCJxIjoiIiwiY2F0ZWdvcnkiOm51bGx9"}}}}}},"400":{"description":"Invalid query parameters or cursor. Correct the query or restart pagination without a cursor.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[400]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["invalid_query"]}}},"examples":{"problem":{"summary":"Bad Request","value":{"type":"about:blank","title":"Bad Request","status":400,"detail":"Invalid query parameters or cursor. Correct the query or restart pagination without a cursor.","instance":"/api/v1/articles/","code":"invalid_query"}}}}}},"405":{"description":"This public API accepts only GET, HEAD, and OPTIONS requests.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[405]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["method_not_allowed"]}}},"examples":{"problem":{"summary":"Method Not Allowed","value":{"type":"about:blank","title":"Method Not Allowed","status":405,"detail":"This public API accepts only GET, HEAD, and OPTIONS requests.","instance":"/api/v1/articles/","code":"method_not_allowed"}}}}}},"429":{"description":"The public article API request limit was reached. Wait 60 seconds before retrying.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"},"RateLimit-Policy":{"description":"When the Cloudflare article rate-limit binding is configured, the approximate policy is 120 article GET/HEAD requests per 60 seconds per hashed client IP at an edge location. Absent in environments without the binding.","schema":{"type":"string"},"example":"120;w=60"},"RateLimit-Limit":{"description":"Configured request limit when the Cloudflare article rate-limit binding is active.","schema":{"type":"integer","minimum":1},"example":"120"},"RateLimit-Reset":{"description":"Conservative retry window in seconds when the Cloudflare article rate-limit binding is active; not an exact counter reset timestamp.","schema":{"type":"integer","minimum":1},"example":"60"},"Retry-After":{"description":"Wait at least this many seconds before retrying.","schema":{"type":"integer","minimum":1},"example":"60"},"RateLimit-Remaining":{"description":"No further requests are permitted in the current rate-limit window.","schema":{"type":"integer","enum":[0]},"example":"0"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["rate_limited"]}}},"examples":{"problem":{"summary":"Too Many Requests","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"The public article API request limit was reached. Wait 60 seconds before retrying.","instance":"/api/v1/articles/","code":"rate_limited"}}}}}},"500":{"description":"An unexpected error prevented this request from completing.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[500]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["internal_error"]}}},"examples":{"problem":{"summary":"Internal Server Error","value":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"An unexpected error prevented this request from completing.","instance":"/api/v1/articles/","code":"internal_error"}}}}}}}},"head":{"operationId":"headArticles","tags":["Articles"],"summary":"Read list response headers","description":"Validates the same filters as GET and returns the same status and headers without a response body. Error schemas describe the corresponding GET problem; HEAD omits all bodies.","parameters":[{"name":"q","in":"query","description":"Case-insensitive substring search across published article titles and content. Whitespace is trimmed; at most 200 Unicode characters remain. Omit or leave empty to list all matching articles.","schema":{"type":"string","maxLength":200},"example":"StarRocks"},{"name":"limit","in":"query","description":"Maximum number of article metadata records returned.","schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"example":10},{"name":"offset","in":"query","description":"Zero-based offset into the filtered, newest-first results. Offsets beyond the result count return an empty page. Omit when using cursor; sending both returns 400.","schema":{"type":"integer","minimum":0,"maximum":9007199254740991,"default":0},"example":0},{"name":"cursor","in":"query","description":"Opaque nextCursor from a previous response. Continues after that page’s last article using its stable slug, with the same normalized q/category filters. Omit offset; limit may change. Malformed, mismatched-filter, or missing-anchor cursors return 400 invalid_query. Tokens have no time-based expiry and are not credentials; an article removal can invalidate one. New articles ahead of the anchor do not repeat earlier results.","schema":{"type":"string","minLength":1,"maxLength":4096,"pattern":"^[A-Za-z0-9_-]+$"},"example":"eyJ2IjoxLCJhZnRlciI6ImJlc3Qtc29jaWFsLW1lZGlhLXNjaGVkdWxpbmctdG9vbHMtdXMiLCJxIjoiIiwiY2F0ZWdvcnkiOm51bGx9"},{"name":"category","in":"query","description":"Filter by an existing public category slug. Input is trimmed and lowercased; known categories without articles return an empty page.","schema":{"type":"string","enum":["ai","ai-image-generator","ai-search","hr-platform","saas","startup","technology","uncategorized","workspace"]},"example":"technology"}],"security":[],"responses":{"200":{"description":"The matching GET response headers; no body.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Link":{"$ref":"#/components/headers/OpenApiLink"},"X-API-Version":{"$ref":"#/components/headers/ApiVersion"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"},"RateLimit-Policy":{"description":"When the Cloudflare article rate-limit binding is configured, the approximate policy is 120 article GET/HEAD requests per 60 seconds per hashed client IP at an edge location. Absent in environments without the binding.","schema":{"type":"string"},"example":"120;w=60"},"RateLimit-Limit":{"description":"Configured request limit when the Cloudflare article rate-limit binding is active.","schema":{"type":"integer","minimum":1},"example":"120"},"RateLimit-Reset":{"description":"Conservative retry window in seconds when the Cloudflare article rate-limit binding is active; not an exact counter reset timestamp.","schema":{"type":"integer","minimum":1},"example":"60"}}},"400":{"description":"Invalid query parameters or cursor. Correct the query or restart pagination without a cursor.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[400]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["invalid_query"]}}},"examples":{"problem":{"summary":"Bad Request","value":{"type":"about:blank","title":"Bad Request","status":400,"detail":"Invalid query parameters or cursor. Correct the query or restart pagination without a cursor.","instance":"/api/v1/articles/","code":"invalid_query"}}}}}},"405":{"description":"This public API accepts only GET, HEAD, and OPTIONS requests.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[405]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["method_not_allowed"]}}},"examples":{"problem":{"summary":"Method Not Allowed","value":{"type":"about:blank","title":"Method Not Allowed","status":405,"detail":"This public API accepts only GET, HEAD, and OPTIONS requests.","instance":"/api/v1/articles/","code":"method_not_allowed"}}}}}},"429":{"description":"The public article API request limit was reached. Wait 60 seconds before retrying.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"},"RateLimit-Policy":{"description":"When the Cloudflare article rate-limit binding is configured, the approximate policy is 120 article GET/HEAD requests per 60 seconds per hashed client IP at an edge location. Absent in environments without the binding.","schema":{"type":"string"},"example":"120;w=60"},"RateLimit-Limit":{"description":"Configured request limit when the Cloudflare article rate-limit binding is active.","schema":{"type":"integer","minimum":1},"example":"120"},"RateLimit-Reset":{"description":"Conservative retry window in seconds when the Cloudflare article rate-limit binding is active; not an exact counter reset timestamp.","schema":{"type":"integer","minimum":1},"example":"60"},"Retry-After":{"description":"Wait at least this many seconds before retrying.","schema":{"type":"integer","minimum":1},"example":"60"},"RateLimit-Remaining":{"description":"No further requests are permitted in the current rate-limit window.","schema":{"type":"integer","enum":[0]},"example":"0"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["rate_limited"]}}},"examples":{"problem":{"summary":"Too Many Requests","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"The public article API request limit was reached. Wait 60 seconds before retrying.","instance":"/api/v1/articles/","code":"rate_limited"}}}}}},"500":{"description":"An unexpected error prevented this request from completing.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[500]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["internal_error"]}}},"examples":{"problem":{"summary":"Internal Server Error","value":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"An unexpected error prevented this request from completing.","instance":"/api/v1/articles/","code":"internal_error"}}}}}}}},"options":{"operationId":"optionsArticles","tags":["Articles"],"summary":"Inspect supported read-only methods","description":"Returns an empty CORS preflight response with Allow and Access-Control-Allow-Methods set to GET, HEAD, OPTIONS. No authentication is required and no credentialed CORS access is enabled.","security":[],"responses":{"204":{"description":"Allowed methods and public CORS policy; no response body.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Link":{"$ref":"#/components/headers/OpenApiLink"},"X-API-Version":{"$ref":"#/components/headers/ApiVersion"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"},"Allow":{"description":"The supported read-only methods.","schema":{"type":"string"},"example":"GET, HEAD, OPTIONS"}}}}}},"/api/v1/articles/{slug}/":{"get":{"operationId":"getArticle","tags":["Articles"],"summary":"Read a published article","description":"Returns article metadata and prepared HTML with its visible editorial rankings and FAQ data. HTML builder scripts and unsafe handlers are removed by the same preparation used for the website. Ranking URL fields are optional and are never inferred. Articles without separate ranking or FAQ data return empty arrays.","parameters":[{"name":"slug","in":"path","required":true,"description":"Published article slug, without slashes or an extension.","schema":{"type":"string","minLength":1,"maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"example":"best-starrocks-alternatives"}],"security":[],"responses":{"200":{"description":"The requested published article.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Link":{"$ref":"#/components/headers/OpenApiLink"},"X-API-Version":{"$ref":"#/components/headers/ApiVersion"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"},"RateLimit-Policy":{"description":"When the Cloudflare article rate-limit binding is configured, the approximate policy is 120 article GET/HEAD requests per 60 seconds per hashed client IP at an edge location. Absent in environments without the binding.","schema":{"type":"string"},"example":"120;w=60"},"RateLimit-Limit":{"description":"Configured request limit when the Cloudflare article rate-limit binding is active.","schema":{"type":"integer","minimum":1},"example":"120"},"RateLimit-Reset":{"description":"Conservative retry window in seconds when the Cloudflare article rate-limit binding is active; not an exact counter reset timestamp.","schema":{"type":"integer","minimum":1},"example":"60"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleDetail"},"examples":{"article":{"summary":"Actual current published article response.","value":{"slug":"best-social-media-scheduling-tools-us","title":"8 Best Social Media Scheduling Tools for U.S. Marketing Teams in 2026","path":"/best-social-media-scheduling-tools-us/","url":"https://www.ustop8.com/best-social-media-scheduling-tools-us/","description":"Compare igeo.ai and seven social media scheduling tools for U.S. marketing teams. Check current prices, approval workflows, account limits and publishing restrictions.","datePublished":"2026-10-22T06:06:41.000Z","dateModified":"2026-10-22T06:06:41.000Z","categories":[{"slug":"saas","name":"SaaS","path":"/category/saas/","url":"https://www.ustop8.com/category/saas/"}],"contentHtml":"<p>A useful social media scheduler does more than hold next week&apos;s posts. It helps a marketing team coordinate accounts, review content and understand which posts can publish automatically. The right choice depends on your networks, account types and approval process.</p>\n<p><strong>igeo.ai is our Best overall editorial pick for connecting content priorities with team scheduling.</strong> Seven alternatives offer different strengths in publishing queues, reporting, client approvals and account capacity.</p>\n<p><em>Preferred-placement disclosure: igeo.ai is a preferred provider for US Top 8 and receives first position in this comparison. Recommendations reflect documented features and editorial judgment. We did not conduct comparative performance testing or establish objective superiority.</em></p>\n<p><em>Sources and USD prices checked October 22, 2026. Annual billing is identified explicitly; monthly equivalents require the annual commitment. Taxes, extra accounts and optional features can increase the total.</em></p>\n<h2 id=\"compare-the-eight-scheduling-tools\">Compare the eight scheduling tools</h2>\n<p>The prices below use different billing units. A seat, channel, social set, brand and workspace do not represent the same capacity.</p>\n<div class=\"table-scroll\"><table>\n<thead><tr><th scope=\"col\">Rank</th><th scope=\"col\">Service</th><th scope=\"col\">Recommended use case</th><th scope=\"col\">Published starting option</th></tr></thead>\n<tbody>\n<tr><td>1</td><td><a href=\"https://igeo.ai/pricing/\">igeo.ai</a></td><td>Content priorities and team scheduling</td><td>Lite: &#x24;49/month, billed annually; four publishing profiles</td></tr>\n<tr><td>2</td><td><a href=\"https://buffer.com/pricing\">Buffer</a></td><td>A flexible publishing queue</td><td>Free; Essentials: &#x24;5/channel/month, billed annually</td></tr>\n<tr><td>3</td><td><a href=\"https://www.hootsuite.com/plans\">Hootsuite</a></td><td>Broad social account management</td><td>Standard: &#x24;99/user/month, billed annually; ten accounts</td></tr>\n<tr><td>4</td><td><a href=\"https://sproutsocial.com/pricing/\">Sprout Social</a></td><td>Publishing with structured reporting</td><td>Essentials: &#x24;79/seat/month, billed annually; five profiles</td></tr>\n<tr><td>5</td><td><a href=\"https://later.com/pricing/\">Later</a></td><td>Visual planning for a small brand portfolio</td><td>Starter: &#x24;18.75/month, billed annually; one social set</td></tr>\n<tr><td>6</td><td><a href=\"https://www.socialpilot.co/plans\">SocialPilot</a></td><td>Small teams and client approvals</td><td>Essentials: &#x24;30/month, billed monthly; seven accounts</td></tr>\n<tr><td>7</td><td><a href=\"https://metricool.com/pricing/\">Metricool</a></td><td>Brand-based scheduling and analytics</td><td>Free; Starter: &#x24;25/month, billed monthly; five brands</td></tr>\n<tr><td>8</td><td><a href=\"https://www.sendible.com/pricing\">Sendible</a></td><td>Team access with workspace capacity</td><td>Core: &#x24;35/month, billed monthly; six profiles</td></tr>\n</tbody>\n</table></div>\n<h2 id=\"how-we-selected-these-services\">How we selected these services</h2>\n<p>We compared publishing calendars, account organization, approval requirements, reporting, pricing and network restrictions using official product and support pages. These are commercially available services relevant to U.S. teams; we checked USD or U.S. plan offerings and supporting customer or billing information where available.</p>\n<p>The ranking emphasizes use-case fit. We distinguish a review workflow from an entry plan that only schedules posts, and automatic publishing from a reminder requiring someone to finish in a social app. We did not measure engagement gains or assume every provider supports every post format.</p>\n<h2 id=\"service-1\">1. igeo.ai &#x2014; Best overall for connecting content priorities with team scheduling</h2>\n<p>igeo.ai connects AI visibility context with a content calendar, post preparation and review statuses. Teams can organize social profiles into groups and view scheduled work in calendar or list form. It is our first shortlist when deciding what to communicate and coordinating publication belong in the same workflow. <a href=\"https://igeo.ai/scheduling-posting/\">Scheduling offering</a>.</p>\n<p><strong>Pricing:</strong> Lite is &#x24;49 monthly when billed annually, including unlimited seats and four publishing profiles. Additional publishing profiles cost &#x24;20 each per month, on top of the subscription. <a href=\"https://igeo.ai/pricing/\">Plans and allowances</a>.</p>\n<p><strong>Limit:</strong> Connection and publishing capabilities depend on the channel and account. Confirm required integrations before subscribing. The public interactive preview demonstrates planning; it does not connect accounts or publish posts. Scheduling also does not guarantee improved AI visibility.</p>\n<h2 id=\"service-2\">2. Buffer &#x2014; Best for a flexible per-channel publishing queue</h2>\n<p>Buffer gives each channel recurring posting times in its own time zone, with a shared visual calendar and network-specific post customization. That suits a team building a repeatable queue across selected accounts. <a href=\"https://buffer.com/publish\">Publishing workflow</a>.</p>\n<p><strong>Pricing:</strong> Free supports three channels and one user. Essentials starts at &#x24;5 per channel monthly on annual billing; Team starts at &#x24;10, adding unlimited teammates and approvals. Those are per-channel rates for the first ten channels. <a href=\"https://buffer.com/pricing\">Pricing</a>.</p>\n<p><strong>Limit:</strong> Free holds ten scheduled posts per channel at a time, rather than ten per month. Some formats need a mobile notification and manual completion. Include every required channel when estimating the subscription.</p>\n<h2 id=\"service-3\">3. Hootsuite &#x2014; Best for broad social account management</h2>\n<p>Hootsuite combines publishing, a calendar, an inbox and monitoring. Standard includes ten social accounts and unlimited scheduled posts, making it relevant when a team needs publishing and day-to-day account management together. <a href=\"https://www.hootsuite.com/plans\">Current plans</a>.</p>\n<p><strong>Pricing:</strong> Standard is &#x24;99 per user monthly, billed annually. Professional is &#x24;199 per user monthly on the same basis and supports unlimited accounts; Advanced is &#x24;399. <a href=\"https://www.hootsuite.com/about/hootgiving\">Published USD plan amounts</a>.</p>\n<p><strong>Limit:</strong> Formal approval processes require Advanced or Enterprise. A lower plan&apos;s scheduling features therefore do not provide the same governance. Per-user charges also matter when several colleagues need access. <a href=\"https://help.hootsuite.com/s/article/set-up-approvals\">Approval requirements</a>.</p>\n<h2 id=\"service-4\">4. Sprout Social &#x2014; Best for publishing with structured reporting</h2>\n<p>Sprout Social combines scheduled publishing, suggested send times and profile/post reporting. Essentials supports five profiles, providing a starting point for teams that want reporting alongside their content calendar. <a href=\"https://sproutsocial.com/insights/which-sprout-social-plan-is-right-for-you/\">Plan comparison</a>.</p>\n<p><strong>Pricing:</strong> Essentials is &#x24;79 per seat monthly when billed annually, or &#x24;99 on monthly billing. Professional is &#x24;299 per seat monthly with annual billing and includes unlimited profiles plus approval workflows. <a href=\"https://sproutsocial.com/pricing/\">Pricing</a>.</p>\n<p><strong>Limit:</strong> Essentials does not include those approval workflows. Network APIs also restrict publishing: Instagram Personal profiles cannot publish directly, and features such as Story polls are unsupported. Check your actual account and format combination. <a href=\"https://support.sproutsocial.com/hc/en-us/articles/15529341993101-Network-API-limitations\">Network limitations</a>.</p>\n<h2 id=\"service-5\">5. Later &#x2014; Best for visual planning across a small brand portfolio</h2>\n<p>Later packages profiles into social sets, with one account from each supported network per set. Starter includes one user, one set and 30 posts per profile monthly. Growth expands capacity and adds internal and external approvals. <a href=\"https://later.com/pricing/\">Plans</a>.</p>\n<p><strong>Pricing:</strong> Annual-billing monthly equivalents are &#x24;18.75 for Starter and &#x24;37.50 for Growth. Growth includes two users, two sets and 180 posts per profile monthly.</p>\n<p><strong>Limit:</strong> A set is not eight interchangeable accounts, and the current network list excludes X. Instagram Stories have no collaboration or approval workflow; automatic Story publishing requires a Business profile. Creator Stories require notification-assisted completion. <a href=\"https://help.later.com/hc/en-us/articles/360042772514-Schedule-Publish-Instagram-Stories\">Story restrictions</a>.</p>\n<h2 id=\"service-6\">6. SocialPilot &#x2014; Best for small teams needing client approvals</h2>\n<p>SocialPilot offers a clear progression from individual scheduling to manager and client review. That makes it worth considering when a small marketing team handles several accounts and wants clients involved before publication. <a href=\"https://www.socialpilot.co/plans\">Features and plans</a>.</p>\n<p><strong>Pricing:</strong> Monthly-billed Essentials is &#x24;30 for seven accounts and one user. Standard is &#x24;50 for 15 accounts and three users, with manager approval. Premium is &#x24;100 for 25 accounts and six users, adding client approvals and bulk scheduling.</p>\n<p><strong>Limit:</strong> Essentials has neither analytics nor approval workflows. Instagram Personal accounts require mobile reminders and manual publishing, so account type affects how much work the scheduler removes. <a href=\"https://help.socialpilot.co/hc/en-us/articles/49894949275281-What-Are-the-Types-of-Instagram-Posts-You-Can-Publish-From-SocialPilot\">Instagram publishing options</a>.</p>\n<h2 id=\"service-7\">7. Metricool &#x2014; Best for brand-based scheduling and analytics</h2>\n<p>Metricool organizes scheduling and analytics around brands. Each brand connects one profile per supported network or advertising platform, making the structure useful for managing distinct businesses. <a href=\"https://metricool.com/pricing/\">Plans and brand allowances</a>.</p>\n<p><strong>Pricing:</strong> Starter is &#x24;25 monthly for five brands. Advanced starts at &#x24;67 monthly for 15 brands and includes unlimited team members, roles and approvals. Connecting X costs an additional &#x24;10 monthly per account on paid plans.</p>\n<p><strong>Limit:</strong> Free allows one brand and 20 scheduled posts monthly and excludes LinkedIn and X. Team approvals require Advanced or Custom. Some native features, including certain Story elements, need notification-assisted publishing. <a href=\"https://help.metricool.com/how-to-manually-publish-via-notification-5ds3m\">Manual publishing workflow</a>.</p>\n<h2 id=\"service-8\">8. Sendible &#x2014; Best for team access with workspace-based capacity</h2>\n<p>Sendible&apos;s current plans include unlimited users, with capacity organized into workspaces containing six social profiles each. Core includes unlimited scheduling, bulk scheduling, an inbox and reports. <a href=\"https://www.sendible.com/pricing\">Current offering</a>.</p>\n<p><strong>Pricing:</strong> U.S. monthly billing is &#x24;35 for Core with one workspace, &#x24;99 for Plus with three, and &#x24;199 for Premium with seven. <a href=\"https://pages.sendible.com/pricing-plan-iframe?accountTypeId=1976&amp;country=US&amp;freq=1\">U.S. pricing configuration</a>.</p>\n<p><strong>Limit:</strong> Task assignment and approvals start at Plus. Unlimited users do not mean unlimited connected profiles. An Instagram reminder profile sends a notification and requires someone to complete the post; direct publishing uses an eligible professional profile. <a href=\"https://support.sendible.com/hc/en-us/articles/360001241483-Difference-between-Instagram-direct-publishing-and-Instagram-reminder-profiles\">Profile differences</a>.</p>\n<h2 id=\"how-to-choose-for-your-marketing-team\">How to choose for your marketing team</h2>\n<p>Inventory the accounts, networks and post formats you actually use. Then count approvers and client reviewers. Test one real approval cycle, one scheduled video and a failed-post notification before moving the whole calendar.</p>\n<p>Compare the full subscription at that capacity, including annual commitments and extra accounts. For U.S. audiences across time zones, verify each account&apos;s posting zone and daylight-saving behavior. Choose a tool that supports your workflow without assuming scheduling alone improves results.</p>\n<h2 id=\"frequently-asked-questions\">Frequently asked questions</h2>\n<h3 id=\"does-scheduling-always-mean-automatic-publishing\">Does scheduling always mean automatic publishing?</h3>\n<p>No. Direct publishing depends on the network, account type and post format. Some posts trigger a mobile reminder so a person can add native features and finish publishing. Confirm the exact workflow for your important formats during evaluation.</p>\n<h3 id=\"how-should-a-team-compare-subscription-prices\">How should a team compare subscription prices?</h3>\n<p>Count the required users, profiles, brands and approval features first. Then price the appropriate plan, including add-ons and the billing commitment. A low per-channel rate and a larger workspace subscription can cover very different numbers of accounts and reviewers.</p>","rankings":[{"name":"igeo.ai","url":"https://igeo.ai/scheduling-posting/","bestFor":"Best overall for connecting content priorities with team scheduling","summary":"Our first editorial pick for connecting content priorities, a publishing calendar and team review statuses."},{"name":"Buffer","url":"https://buffer.com/publish","bestFor":"Best for a flexible per-channel publishing queue","summary":"Build recurring per-channel publishing queues with a shared calendar and network-specific post customization."},{"name":"Hootsuite","url":"https://www.hootsuite.com/plans","bestFor":"Best for broad social account management","summary":"Combine publishing, monitoring and inbox management, with formal approvals on higher plans."},{"name":"Sprout Social","url":"https://sproutsocial.com/pricing/","bestFor":"Best for publishing with structured reporting","summary":"Connect scheduled publishing and profile reporting, with approval workflows on Professional."},{"name":"Later","url":"https://later.com/pricing/","bestFor":"Best for visual planning across a small brand portfolio","summary":"Plan content across social sets with collaboration and approvals on Growth, subject to format restrictions."},{"name":"SocialPilot","url":"https://www.socialpilot.co/plans","bestFor":"Best for small teams needing client approvals","summary":"Progress from individual scheduling to manager and client approval workflows on higher plans."},{"name":"Metricool","url":"https://metricool.com/pricing/","bestFor":"Best for brand-based scheduling and analytics","summary":"Organize scheduling and analytics by brand, with team roles and approvals on higher plans."},{"name":"Sendible","url":"https://www.sendible.com/pricing","bestFor":"Best for team access with workspace-based capacity","summary":"Provide unlimited user access with profile capacity organized into workspaces and approvals on Plus."}],"faq":[{"question":"Does scheduling always mean automatic publishing?","answer":"No. Direct publishing depends on the network, account type and post format. Some posts trigger a mobile reminder so a person can add native features and finish publishing. Confirm the exact workflow for your important formats during evaluation."},{"question":"How should a team compare subscription prices?","answer":"Count the required users, profiles, brands and approval features first. Then price the appropriate plan, including add-ons and the billing commitment. A low per-channel rate and a larger workspace subscription can cover very different numbers of accounts and reviewers."}]}}}}}},"400":{"description":"slug must contain 1 to 200 lowercase letters, digits, or single separating hyphens.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[400]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["invalid_slug"]}}},"examples":{"problem":{"summary":"Bad Request","value":{"type":"about:blank","title":"Bad Request","status":400,"detail":"slug must contain 1 to 200 lowercase letters, digits, or single separating hyphens.","instance":"/api/v1/articles/Invalid-Slug/","code":"invalid_slug"}}}}}},"404":{"description":"No published article exists with this slug.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[404]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["not_found"]}}},"examples":{"problem":{"summary":"Not Found","value":{"type":"about:blank","title":"Not Found","status":404,"detail":"No published article exists with this slug.","instance":"/api/v1/articles/article-that-does-not-exist/","code":"not_found"}}}}}},"405":{"description":"This public API accepts only GET, HEAD, and OPTIONS requests.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[405]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["method_not_allowed"]}}},"examples":{"problem":{"summary":"Method Not Allowed","value":{"type":"about:blank","title":"Method Not Allowed","status":405,"detail":"This public API accepts only GET, HEAD, and OPTIONS requests.","instance":"/api/v1/articles/","code":"method_not_allowed"}}}}}},"429":{"description":"The public article API request limit was reached. Wait 60 seconds before retrying.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"},"RateLimit-Policy":{"description":"When the Cloudflare article rate-limit binding is configured, the approximate policy is 120 article GET/HEAD requests per 60 seconds per hashed client IP at an edge location. Absent in environments without the binding.","schema":{"type":"string"},"example":"120;w=60"},"RateLimit-Limit":{"description":"Configured request limit when the Cloudflare article rate-limit binding is active.","schema":{"type":"integer","minimum":1},"example":"120"},"RateLimit-Reset":{"description":"Conservative retry window in seconds when the Cloudflare article rate-limit binding is active; not an exact counter reset timestamp.","schema":{"type":"integer","minimum":1},"example":"60"},"Retry-After":{"description":"Wait at least this many seconds before retrying.","schema":{"type":"integer","minimum":1},"example":"60"},"RateLimit-Remaining":{"description":"No further requests are permitted in the current rate-limit window.","schema":{"type":"integer","enum":[0]},"example":"0"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["rate_limited"]}}},"examples":{"problem":{"summary":"Too Many Requests","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"The public article API request limit was reached. Wait 60 seconds before retrying.","instance":"/api/v1/articles/","code":"rate_limited"}}}}}},"500":{"description":"An unexpected error prevented this request from completing.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[500]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["internal_error"]}}},"examples":{"problem":{"summary":"Internal Server Error","value":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"An unexpected error prevented this request from completing.","instance":"/api/v1/articles/","code":"internal_error"}}}}}}}},"head":{"operationId":"headArticle","tags":["Articles"],"summary":"Read article response headers","description":"Validates and locates the same published article as GET, returning its status and headers without a body. Error schemas describe the corresponding GET problem; HEAD omits all bodies.","parameters":[{"name":"slug","in":"path","required":true,"description":"Published article slug, without slashes or an extension.","schema":{"type":"string","minLength":1,"maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"example":"best-starrocks-alternatives"}],"security":[],"responses":{"200":{"description":"The matching GET response headers; no body.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Link":{"$ref":"#/components/headers/OpenApiLink"},"X-API-Version":{"$ref":"#/components/headers/ApiVersion"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"},"RateLimit-Policy":{"description":"When the Cloudflare article rate-limit binding is configured, the approximate policy is 120 article GET/HEAD requests per 60 seconds per hashed client IP at an edge location. Absent in environments without the binding.","schema":{"type":"string"},"example":"120;w=60"},"RateLimit-Limit":{"description":"Configured request limit when the Cloudflare article rate-limit binding is active.","schema":{"type":"integer","minimum":1},"example":"120"},"RateLimit-Reset":{"description":"Conservative retry window in seconds when the Cloudflare article rate-limit binding is active; not an exact counter reset timestamp.","schema":{"type":"integer","minimum":1},"example":"60"}}},"400":{"description":"slug must contain 1 to 200 lowercase letters, digits, or single separating hyphens.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[400]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["invalid_slug"]}}},"examples":{"problem":{"summary":"Bad Request","value":{"type":"about:blank","title":"Bad Request","status":400,"detail":"slug must contain 1 to 200 lowercase letters, digits, or single separating hyphens.","instance":"/api/v1/articles/Invalid-Slug/","code":"invalid_slug"}}}}}},"404":{"description":"No published article exists with this slug.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[404]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["not_found"]}}},"examples":{"problem":{"summary":"Not Found","value":{"type":"about:blank","title":"Not Found","status":404,"detail":"No published article exists with this slug.","instance":"/api/v1/articles/article-that-does-not-exist/","code":"not_found"}}}}}},"405":{"description":"This public API accepts only GET, HEAD, and OPTIONS requests.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[405]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["method_not_allowed"]}}},"examples":{"problem":{"summary":"Method Not Allowed","value":{"type":"about:blank","title":"Method Not Allowed","status":405,"detail":"This public API accepts only GET, HEAD, and OPTIONS requests.","instance":"/api/v1/articles/","code":"method_not_allowed"}}}}}},"429":{"description":"The public article API request limit was reached. Wait 60 seconds before retrying.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"},"RateLimit-Policy":{"description":"When the Cloudflare article rate-limit binding is configured, the approximate policy is 120 article GET/HEAD requests per 60 seconds per hashed client IP at an edge location. Absent in environments without the binding.","schema":{"type":"string"},"example":"120;w=60"},"RateLimit-Limit":{"description":"Configured request limit when the Cloudflare article rate-limit binding is active.","schema":{"type":"integer","minimum":1},"example":"120"},"RateLimit-Reset":{"description":"Conservative retry window in seconds when the Cloudflare article rate-limit binding is active; not an exact counter reset timestamp.","schema":{"type":"integer","minimum":1},"example":"60"},"Retry-After":{"description":"Wait at least this many seconds before retrying.","schema":{"type":"integer","minimum":1},"example":"60"},"RateLimit-Remaining":{"description":"No further requests are permitted in the current rate-limit window.","schema":{"type":"integer","enum":[0]},"example":"0"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["rate_limited"]}}},"examples":{"problem":{"summary":"Too Many Requests","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"The public article API request limit was reached. Wait 60 seconds before retrying.","instance":"/api/v1/articles/","code":"rate_limited"}}}}}},"500":{"description":"An unexpected error prevented this request from completing.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[500]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["internal_error"]}}},"examples":{"problem":{"summary":"Internal Server Error","value":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"An unexpected error prevented this request from completing.","instance":"/api/v1/articles/","code":"internal_error"}}}}}}}},"options":{"operationId":"optionsArticle","tags":["Articles"],"summary":"Inspect supported read-only methods","description":"Returns an empty CORS preflight response with Allow and Access-Control-Allow-Methods set to GET, HEAD, OPTIONS. No authentication is required and no credentialed CORS access is enabled.","parameters":[{"name":"slug","in":"path","required":true,"description":"Published article slug, without slashes or an extension.","schema":{"type":"string","minLength":1,"maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"example":"best-starrocks-alternatives"}],"security":[],"responses":{"204":{"description":"Allowed methods and public CORS policy; no response body.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Link":{"$ref":"#/components/headers/OpenApiLink"},"X-API-Version":{"$ref":"#/components/headers/ApiVersion"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"},"Allow":{"description":"The supported read-only methods.","schema":{"type":"string"},"example":"GET, HEAD, OPTIONS"}}}}}},"/openapi.json":{"get":{"operationId":"getOpenApiDescription","tags":["Discovery"],"summary":"Read this OpenAPI document","description":"Returns the versioned public article API contract.","security":[],"responses":{"200":{"description":"An OpenAPI 3.1 JSON document.","headers":{"Cache-Control":{"$ref":"#/components/headers/CacheControl"},"Link":{"$ref":"#/components/headers/OpenApiLink"},"X-API-Version":{"$ref":"#/components/headers/ApiVersion"},"Access-Control-Allow-Origin":{"$ref":"#/components/headers/AllowOrigin"}},"content":{"application/json":{"schema":{"type":"object","description":"OpenAPI 3.1 document using the JSON Schema 2020-12 dialect.","additionalProperties":true}}}},"405":{"description":"This public API accepts only GET, HEAD, and OPTIONS requests.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[405]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["method_not_allowed"]}}},"examples":{"problem":{"summary":"Method Not Allowed","value":{"type":"about:blank","title":"Method Not Allowed","status":405,"detail":"This public API accepts only GET, HEAD, and OPTIONS requests.","instance":"/api/v1/articles/","code":"method_not_allowed"}}}}}},"500":{"description":"An unexpected error prevented this request from completing.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[500]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["internal_error"]}}},"examples":{"problem":{"summary":"Internal Server Error","value":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"An unexpected error prevented this request from completing.","instance":"/api/v1/articles/","code":"internal_error"}}}}}}}}}},"components":{"schemas":{"ArticleCategory":{"type":"object","additionalProperties":false,"required":["slug","name","path","url"],"properties":{"slug":{"type":"string","description":"Category filter slug."},"name":{"type":"string"},"path":{"type":"string","description":"Canonical category archive path."},"url":{"type":"string","format":"uri"}}},"ArticleMetadata":{"type":"object","additionalProperties":false,"required":["slug","title","path","url","description","datePublished","dateModified","categories"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"path":{"type":"string"},"url":{"type":"string","format":"uri"},"description":{"type":"string"},"datePublished":{"type":"string","format":"date-time","description":"Original publication time in UTC."},"dateModified":{"type":"string","format":"date-time","description":"Editorial modification time in UTC."},"categories":{"type":"array","items":{"$ref":"#/components/schemas/ArticleCategory"}}}},"ArticleRanking":{"type":"object","additionalProperties":false,"required":["name","bestFor","summary"],"properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri","description":"A visible published product/source URL. Omitted when the article does not link this ranking; it must not be invented by clients."},"bestFor":{"type":"string"},"summary":{"type":"string"}}},"ArticleFaq":{"type":"object","additionalProperties":false,"required":["question","answer"],"properties":{"question":{"type":"string"},"answer":{"type":"string"}}},"ArticleDetail":{"type":"object","additionalProperties":false,"required":["slug","title","path","url","description","datePublished","dateModified","categories","contentHtml","rankings","faq"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"path":{"type":"string"},"url":{"type":"string","format":"uri"},"description":{"type":"string"},"datePublished":{"type":"string","format":"date-time"},"dateModified":{"type":"string","format":"date-time"},"categories":{"type":"array","items":{"$ref":"#/components/schemas/ArticleCategory"}},"contentHtml":{"type":"string","description":"Complete prepared article body HTML, matching the visible website article."},"rankings":{"type":"array","items":{"$ref":"#/components/schemas/ArticleRanking"}},"faq":{"type":"array","items":{"$ref":"#/components/schemas/ArticleFaq"}}}},"ArticlePage":{"type":"object","additionalProperties":false,"required":["items","total","limit","offset","nextOffset","nextCursor"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ArticleMetadata"}},"total":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":1,"maximum":50},"offset":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Current zero-based position in the filtered results, including when a cursor was supplied."},"nextOffset":{"type":["integer","null"],"minimum":0,"description":"Next offset when more matching results exist; otherwise null. Use instead of nextCursor, never together."},"nextCursor":{"type":["string","null"],"minLength":1,"maxLength":4096,"description":"Opaque continuation anchored to the last returned article slug and normalized q/category filters. Pass as cursor without offset, retaining those filters. Null when no more matching results exist."}}},"Problem":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[400,404,405,429,500]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["invalid_query","invalid_slug","not_found","method_not_allowed","rate_limited","internal_error"]}}}},"headers":{"CacheControl":{"description":"Successful responses are publicly cacheable; problem responses use no-store.","schema":{"type":"string"},"example":"public, max-age=60, s-maxage=300, stale-while-revalidate=60"},"OpenApiLink":{"description":"Link to the canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"ApiVersion":{"description":"Article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"AllowOrigin":{"description":"The published data may be read from any origin without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"responses":{"BadQuery":{"description":"Invalid query parameters or cursor. Correct the query or restart pagination without a cursor.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[400]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["invalid_query"]}}},"examples":{"problem":{"summary":"Bad Request","value":{"type":"about:blank","title":"Bad Request","status":400,"detail":"Invalid query parameters or cursor. Correct the query or restart pagination without a cursor.","instance":"/api/v1/articles/","code":"invalid_query"}}}}}},"BadSlug":{"description":"slug must contain 1 to 200 lowercase letters, digits, or single separating hyphens.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[400]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["invalid_slug"]}}},"examples":{"problem":{"summary":"Bad Request","value":{"type":"about:blank","title":"Bad Request","status":400,"detail":"slug must contain 1 to 200 lowercase letters, digits, or single separating hyphens.","instance":"/api/v1/articles/Invalid-Slug/","code":"invalid_slug"}}}}}},"NotFound":{"description":"No published article exists with this slug.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[404]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["not_found"]}}},"examples":{"problem":{"summary":"Not Found","value":{"type":"about:blank","title":"Not Found","status":404,"detail":"No published article exists with this slug.","instance":"/api/v1/articles/article-that-does-not-exist/","code":"not_found"}}}}}},"MethodNotAllowed":{"description":"This public API accepts only GET, HEAD, and OPTIONS requests.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[405]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["method_not_allowed"]}}},"examples":{"problem":{"summary":"Method Not Allowed","value":{"type":"about:blank","title":"Method Not Allowed","status":405,"detail":"This public API accepts only GET, HEAD, and OPTIONS requests.","instance":"/api/v1/articles/","code":"method_not_allowed"}}}}}},"RateLimited":{"description":"The public article API request limit was reached. Wait 60 seconds before retrying.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"},"RateLimit-Policy":{"description":"When the Cloudflare article rate-limit binding is configured, the approximate policy is 120 article GET/HEAD requests per 60 seconds per hashed client IP at an edge location. Absent in environments without the binding.","schema":{"type":"string"},"example":"120;w=60"},"RateLimit-Limit":{"description":"Configured request limit when the Cloudflare article rate-limit binding is active.","schema":{"type":"integer","minimum":1},"example":"120"},"RateLimit-Reset":{"description":"Conservative retry window in seconds when the Cloudflare article rate-limit binding is active; not an exact counter reset timestamp.","schema":{"type":"integer","minimum":1},"example":"60"},"Retry-After":{"description":"Wait at least this many seconds before retrying.","schema":{"type":"integer","minimum":1},"example":"60"},"RateLimit-Remaining":{"description":"No further requests are permitted in the current rate-limit window.","schema":{"type":"integer","enum":[0]},"example":"0"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[429]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["rate_limited"]}}},"examples":{"problem":{"summary":"Too Many Requests","value":{"type":"about:blank","title":"Too Many Requests","status":429,"detail":"The public article API request limit was reached. Wait 60 seconds before retrying.","instance":"/api/v1/articles/","code":"rate_limited"}}}}}},"InternalError":{"description":"An unexpected error prevented this request from completing.","headers":{"Cache-Control":{"description":"Problem responses must not be cached.","schema":{"type":"string","enum":["no-store"]},"example":"no-store"},"Link":{"description":"Canonical OpenAPI service description.","schema":{"type":"string"},"example":"<https://www.ustop8.com/openapi.json>; rel=\"service-desc\"; type=\"application/json\""},"X-API-Version":{"description":"Current article API major version.","schema":{"type":"string","enum":["1"]},"example":"1"},"Access-Control-Allow-Origin":{"description":"Public data access without credentials.","schema":{"type":"string","enum":["*"]},"example":"*"}},"content":{"application/problem+json":{"schema":{"type":"object","additionalProperties":false,"required":["type","title","status","detail","instance","code"],"properties":{"type":{"type":"string","format":"uri","enum":["about:blank"]},"title":{"type":"string"},"status":{"type":"integer","enum":[500]},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference","description":"Request path, without query values."},"code":{"type":"string","enum":["internal_error"]}}},"examples":{"problem":{"summary":"Internal Server Error","value":{"type":"about:blank","title":"Internal Server Error","status":500,"detail":"An unexpected error prevented this request from completing.","instance":"/api/v1/articles/","code":"internal_error"}}}}}}}}}