{"openapi":"3.1.0","info":{"title":"TalkSearch API","version":"1.2.0","description":"Search and retrieve indexed Bitcointalk posts, topics, profiles, and cached images through a prepaid, pay-as-you-go JSON API.","termsOfService":"https://talksearch.io/terms","contact":{"name":"TalkSearch","url":"https://talksearch.io/developers"},"license":{"name":"TalkSearch API Terms of Service","url":"https://talksearch.io/terms"}},"externalDocs":{"description":"TalkSearch developer documentation","url":"https://talksearch.io/developers/docs"},"servers":[{"url":"https://talksearch.io","description":"Production"}],"tags":[{"name":"Search","description":"Search indexed Bitcointalk post content."},{"name":"Images","description":"Find images in matching posts and return owned CDN URLs."},{"name":"Corpus","description":"Retrieve an individual indexed resource by Bitcointalk ID."},{"name":"Collections","description":"Page chronologically through complete indexed posts in a topic or by an author."}],"paths":{"/api/v1/search":{"get":{"operationId":"searchBitcointalkPosts","summary":"Search indexed Bitcointalk posts","description":"Returns ranked post-level results. One credit is charged only when the search completes successfully.","tags":["Search"],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Search query. Must contain between 1 and 512 characters.","schema":{"type":"string","minLength":1,"maxLength":512},"example":"taproot fee estimation"},{"name":"lang","in":"query","required":false,"description":"Language index to search, such as en, de, fr, or pt-BR.","schema":{"type":"string","pattern":"^[a-z]{2}(?:-[A-Z]{2})?$"},"example":"en"},{"name":"freshness","in":"query","required":false,"description":"Set to 1 to prefer newer posts. Omit it to use automatic freshness intent detection.","schema":{"type":"string","enum":["1"]},"example":"1"},{"name":"include_low_quality","in":"query","required":false,"description":"Set to 1 to include replies normally removed by TalkSearch quality and spam filtering.","schema":{"type":"string","enum":["1"]},"example":"1"}],"responses":{"200":{"description":"Search completed and one credit was charged.","headers":{"X-Request-Id":{"schema":{"type":"string","format":"uuid"},"description":"Request identifier for support and tracing."},"X-Credits-Charged":{"schema":{"type":"integer","example":1}},"X-Credits-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Limit":{"schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the rate window resets."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"},"example":{"query":"taproot fee estimation","corrected_query":null,"lang":"en","board_scope":"strict-language-boards-v1","index":"talksearch_posts_v3_en","did_you_mean":null,"hybrid":true,"freshness":false,"answer_seeking":true,"total":127,"hits":[{"post_id":64551288,"topic_id":5500892,"title":"When Taproot?","topic_title":"When Taproot?","post_title":"Re: When Taproot?","content":"Example matching Bitcointalk post content.","author":"ExampleUser","author_uid":3534730,"date":"2024-09-20T01:58:23.000Z","board_id":1,"board_name":"Bitcoin Discussion","lang":"en","score":0.822709,"spam_score":0,"ai_score":0,"health_score":1,"rank_source":"hybrid","ranking_model_version":"relevance-authority-v5","search_index":"talksearch_posts_v3_en"}]}}}},"400":{"description":"Invalid request parameters. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"402":{"description":"Insufficient prepaid credits.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"403":{"description":"Source IP is not permitted by the key allowlist. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"429":{"description":"Rate limit exceeded. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"503":{"description":"Operation did not complete and the credit was restored.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}}}}},"/api/v1/images/search":{"get":{"operationId":"searchBitcointalkImages","summary":"Search cached Bitcointalk images","description":"Searches post context, deduplicates matching cached objects, and returns TalkSearch CDN URLs. High-confidence NSFW is hidden by default. One credit is charged only on success.","tags":["Images"],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Search query. Must contain between 1 and 512 characters.","schema":{"type":"string","minLength":1,"maxLength":512},"example":"taproot fee estimation"},{"name":"lang","in":"query","required":false,"description":"Language index to search, such as en, de, fr, or pt-BR.","schema":{"type":"string","pattern":"^[a-z]{2}(?:-[A-Z]{2})?$"},"example":"en"},{"name":"freshness","in":"query","required":false,"description":"Set to 1 to prefer newer posts. Omit it to use automatic freshness intent detection.","schema":{"type":"string","enum":["1"]},"example":"1"},{"name":"include_low_quality","in":"query","required":false,"description":"Set to 1 to include replies normally removed by TalkSearch quality and spam filtering.","schema":{"type":"string","enum":["1"]},"example":"1"},{"name":"size","in":"query","required":false,"description":"Maximum unique images to return, from 1 to 50. Defaults to 24.","schema":{"type":"integer","minimum":1,"maximum":50},"example":24},{"name":"hide_nsfw","in":"query","required":false,"description":"High-confidence NSFW images are hidden by default. Set to 0 to include them.","schema":{"type":"string","enum":["0"]},"example":"0"}],"responses":{"200":{"description":"Image search completed and one credit was charged.","headers":{"X-Request-Id":{"schema":{"type":"string","format":"uuid"},"description":"Request identifier for support and tracing."},"X-Credits-Charged":{"schema":{"type":"integer","example":1}},"X-Credits-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Limit":{"schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the rate window resets."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageSearchResponse"},"example":{"object":"image_search","query":"hardware wallet","corrected_query":null,"lang":"en","board_scope":"strict-language-boards-v1","hide_nsfw":true,"post_matches_considered":50,"total":1,"images":[{"object":"image","sha256":"53e2d1c2be8f2a0c87efbd85c73915b58344fd9a7f40b6eeb734f4014b5d0f07","url":"https://cdn.talksearch.io/media/images/53e2d1c2be8f2a0c87efbd85c73915b58344fd9a7f40b6eeb734f4014b5d0f07.avif","mime_type":"image/avif","bytes":48231,"nsfw_score":0.01,"post":{"post_id":64551288,"topic_id":5500892,"title":"Hardware wallet comparison","author":{"profile_id":3534730,"username":"ExampleUser","url":"https://bitcointalk.org/index.php?action=profile;u=3534730"},"board":{"board_id":37,"name":"Hardware Wallets"},"language":"en","posted_at":"2024-09-20T01:58:23.000Z","url":"https://bitcointalk.org/index.php?topic=5500892.msg64551288#msg64551288","topic_url":"https://bitcointalk.org/index.php?topic=5500892.0"}}]}}}},"400":{"description":"Invalid request parameters. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"402":{"description":"Insufficient prepaid credits.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"403":{"description":"Source IP is not permitted by the key allowlist. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"429":{"description":"Rate limit exceeded. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"503":{"description":"Operation did not complete and the credit was restored.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}}}}},"/api/v1/posts/{id}":{"get":{"operationId":"getBitcointalkPost","summary":"Post by ID","description":"Returns one indexed post with rendered HTML, author, board, topic, date, and merit observations. One credit is charged only when the resource is returned.","tags":["Corpus"],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Bitcointalk post ID.","schema":{"type":"integer","minimum":1},"example":34538660}],"responses":{"200":{"description":"Post by ID returned and one credit was charged.","headers":{"X-Request-Id":{"schema":{"type":"string","format":"uuid"},"description":"Request identifier for support and tracing."},"X-Credits-Charged":{"schema":{"type":"integer","example":1}},"X-Credits-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Limit":{"schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the rate window resets."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"},"example":{"object":"post","post_id":34538660,"topic_id":3309245,"post_number":1,"is_op":true,"title":"Forget about exchanger search! Use BestChange!","author":{"profile_id":1978649,"username":"Best.Change","url":"https://bitcointalk.org/index.php?action=profile;u=1978649"},"board":{"board_id":84,"name":"Service Announcements"},"language":"en","posted_at":"2018-04-12T00:00:00.000Z","url":"https://bitcointalk.org/index.php?topic=3309245.msg34538660#msg34538660","topic_url":"https://bitcointalk.org/index.php?topic=3309245.0","content_html":"<p>BestChange.com helps compare exchangers.</p>","indexed_at":"2026-08-29T12:00:00.000Z","merit":{"total":0,"distinct_senders":0,"transactions":0,"observed_at":null}}}}},"400":{"description":"Invalid request parameters. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"402":{"description":"Insufficient prepaid credits.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"403":{"description":"Source IP is not permitted by the key allowlist. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"404":{"description":"Resource not found in the indexed corpus. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"429":{"description":"Rate limit exceeded. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"503":{"description":"Operation did not complete and the credit was restored.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}}}}},"/api/v1/topics/{id}":{"get":{"operationId":"getBitcointalkTopic","summary":"Topic by ID","description":"Returns topic metadata plus the complete first post and a summary of the latest indexed post. One credit is charged only when the resource is returned.","tags":["Corpus"],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Bitcointalk topic ID.","schema":{"type":"integer","minimum":1},"example":3309245}],"responses":{"200":{"description":"Topic by ID returned and one credit was charged.","headers":{"X-Request-Id":{"schema":{"type":"string","format":"uuid"},"description":"Request identifier for support and tracing."},"X-Credits-Charged":{"schema":{"type":"integer","example":1}},"X-Credits-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Limit":{"schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the rate window resets."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Topic"},"example":{"object":"topic","topic_id":3309245,"title":"Forget about exchanger search! Use BestChange!","board":{"board_id":84,"name":"Service Announcements"},"language":"en","created_at":"2018-04-12T00:00:00.000Z","last_post_at":"2026-08-29T00:00:00.000Z","post_count":2400,"page_count":120,"views":{"observed":100000,"observed_at":"2026-08-29T00:00:00.000Z"},"merit":{"total":400,"distinct_senders":120,"transactions":200,"observed_at":"2026-08-29T00:00:00.000Z"},"url":"https://bitcointalk.org/index.php?topic=3309245.0","first_post":{"object":"post","post_id":34538660,"topic_id":3309245,"post_number":1,"is_op":true,"title":"Forget about exchanger search! Use BestChange!","author":{"profile_id":1978649,"username":"Best.Change","url":"https://bitcointalk.org/index.php?action=profile;u=1978649"},"board":{"board_id":84,"name":"Service Announcements"},"language":"en","posted_at":"2018-04-12T00:00:00.000Z","url":"https://bitcointalk.org/index.php?topic=3309245.msg34538660#msg34538660","topic_url":"https://bitcointalk.org/index.php?topic=3309245.0","content_html":"<p>BestChange.com helps compare exchangers.</p>","indexed_at":"2026-08-29T12:00:00.000Z","merit":{"total":0,"distinct_senders":0,"transactions":0,"observed_at":null}},"latest_post":{"post_id":67000000,"topic_id":3309245,"post_number":2400,"is_op":false,"title":"Forget about exchanger search! Use BestChange!","author":{"profile_id":1978649,"username":"Best.Change","url":"https://bitcointalk.org/index.php?action=profile;u=1978649"},"board":{"board_id":84,"name":"Service Announcements"},"language":"en","posted_at":"2026-08-29T00:00:00.000Z","url":"https://bitcointalk.org/index.php?topic=3309245.msg67000000#msg67000000","topic_url":"https://bitcointalk.org/index.php?topic=3309245.0"}}}}},"400":{"description":"Invalid request parameters. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"402":{"description":"Insufficient prepaid credits.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"403":{"description":"Source IP is not permitted by the key allowlist. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"404":{"description":"Resource not found in the indexed corpus. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"429":{"description":"Rate limit exceeded. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"503":{"description":"Operation did not complete and the credit was restored.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}}}}},"/api/v1/profiles/{id}":{"get":{"operationId":"getBitcointalkProfile","summary":"Profile by ID","description":"Returns corpus-derived profile activity and recent posts for a Bitcointalk user ID. One credit is charged only when the resource is returned.","tags":["Corpus"],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Bitcointalk profile ID.","schema":{"type":"integer","minimum":1},"example":1978649}],"responses":{"200":{"description":"Profile by ID returned and one credit was charged.","headers":{"X-Request-Id":{"schema":{"type":"string","format":"uuid"},"description":"Request identifier for support and tracing."},"X-Credits-Charged":{"schema":{"type":"integer","example":1}},"X-Credits-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Limit":{"schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the rate window resets."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profile"},"example":{"object":"profile","profile_id":1978649,"username":"Best.Change","url":"https://bitcointalk.org/index.php?action=profile;u=1978649","corpus":{"post_count":1200,"topic_count":18,"first_post_at":"2017-11-01T00:00:00.000Z","last_post_at":"2026-08-29T00:00:00.000Z","derived_from":"distinct indexed posts"},"recent_posts":[{"post_id":67000000,"topic_id":3309245,"post_number":2400,"is_op":false,"title":"Forget about exchanger search! Use BestChange!","author":{"profile_id":1978649,"username":"Best.Change","url":"https://bitcointalk.org/index.php?action=profile;u=1978649"},"board":{"board_id":84,"name":"Service Announcements"},"language":"en","posted_at":"2026-08-29T00:00:00.000Z","url":"https://bitcointalk.org/index.php?topic=3309245.msg67000000#msg67000000","topic_url":"https://bitcointalk.org/index.php?topic=3309245.0"}]}}}},"400":{"description":"Invalid request parameters. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"402":{"description":"Insufficient prepaid credits.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"403":{"description":"Source IP is not permitted by the key allowlist. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"404":{"description":"Resource not found in the indexed corpus. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"429":{"description":"Rate limit exceeded. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"503":{"description":"Operation did not complete and the credit was restored.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}}}}},"/api/v1/topics/{id}/posts":{"get":{"operationId":"listBitcointalkTopicPosts","summary":"Posts in a topic","tags":["Collections"],"description":"Chronologically page through full indexed posts in a topic, optionally restricted to one author. This is the indexed corpus, not a new scrape. No relevance, language, spam or diversity filters are applied. A frozen initial point-in-time snapshot and a deterministic canonical document per post isolate pagination from new posts, updates and legacy duplicate records. Start a new request without a cursor to see new data. Continue until next_cursor is null: the bounded duplicate-scan budget can produce a short or empty page with a continuation. Cursors inherit all original options, expire after five idle minutes, and cannot outlive the one-hour snapshot. Unknown, repeated or empty options, tampering, and changed options are rejected. One credit is charged for each successful page, including an empty terminal page; validation, expired-cursor and upstream failures are not charged.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Positive safe-integer Bitcointalk topic ID.","schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"example":5480200},{"name":"limit","in":"query","required":false,"description":"Maximum full posts per page (default 50). A bounded duplicate scan can return fewer or zero posts while next_cursor is still present.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"example":50},{"name":"order","in":"query","required":false,"description":"Chronological order; asc (oldest first) is the default. Ties use a stable post-ID order.","schema":{"type":"string","enum":["asc","desc"],"default":"asc"},"example":"asc"},{"name":"date_from","in":"query","required":false,"description":"Inclusive posting-time boundary. Exact YYYY-MM-DD means UTC midnight; alternatively use RFC3339 with an explicit timezone and at most millisecond precision.","schema":{"type":"string"},"example":"2026-09-09"},{"name":"date_to","in":"query","required":false,"description":"Exclusive posting-time boundary, using the same date syntax. For all of September 9 UTC, use date_from=2026-09-09 and date_to=2026-09-10.","schema":{"type":"string"},"example":"2026-09-10"},{"name":"board_id","in":"query","required":false,"description":"Restrict to one Bitcointalk board ID; supported on both collection endpoints.","schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"example":84},{"name":"author_uid","in":"query","required":false,"description":"Topic posts only: restrict the topic to one author’s numeric Bitcointalk user ID.","schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"example":1978649},{"name":"cursor","in":"query","required":false,"description":"Opaque signed continuation token from next_cursor. Send it unchanged. Cursor-only requests inherit the original filters, order and limit; explicitly repeated options must be identical. Never construct a cursor or increment post IDs.","schema":{"type":"string","maxLength":4096},"example":"opaque_payload.opaque_signature"}],"responses":{"200":{"description":"One page returned and one credit charged. No indexed posts returns an empty data array, not 404.","headers":{"X-Request-Id":{"schema":{"type":"string","format":"uuid"},"description":"Request identifier for support and tracing."},"X-Credits-Charged":{"schema":{"type":"integer","example":1}},"X-Credits-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Limit":{"schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the rate window resets."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostList"},"example":{"object":"post_list","scope":{"type":"topic","id":5480200},"order":"asc","limit":50,"filters":{"date_from":"2026-09-09T00:00:00.000Z","date_to":null,"board_id":null,"author_uid":null,"topic_id":null},"snapshot_at":"2026-09-26T12:00:00.000Z","cursor_expires_at":"2026-09-26T12:05:00.000Z","has_more":true,"next_cursor":"opaque_payload.opaque_signature","data":[{"object":"post","post_id":67000001,"topic_id":5480200,"post_number":2,"is_op":false,"title":"Example topic","author":{"profile_id":1978649,"username":"Best.Change","url":"https://bitcointalk.org/index.php?action=profile;u=1978649"},"board":{"board_id":84,"name":"Service Announcements"},"language":"en","posted_at":"2026-09-09T12:30:00.000Z","url":"https://bitcointalk.org/index.php?topic=5480200.msg67000001#msg67000001","topic_url":"https://bitcointalk.org/index.php?topic=5480200.0","content_html":"<p>Illustrative indexed post content.</p>","indexed_at":"2026-09-26T11:59:00.000Z","merit":{"total":0,"distinct_senders":0,"transactions":0,"observed_at":null}}]}}}},"400":{"description":"Invalid request parameters. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"402":{"description":"Insufficient prepaid credits.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"403":{"description":"Source IP is not permitted by the key allowlist. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"404":{"description":"Resource not found in the indexed corpus. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"410":{"description":"Cursor or snapshot expired. No credit is charged; restart without a cursor.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"429":{"description":"Rate limit exceeded. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"503":{"description":"Operation did not complete and the credit was restored.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}}}}},"/api/v1/profiles/{id}/posts":{"get":{"operationId":"listBitcointalkProfilePosts","summary":"Posts by a profile","tags":["Collections"],"description":"Chronologically page through full indexed posts by an author, optionally restricted to one topic. This is the indexed corpus, not a new scrape. No relevance, language, spam or diversity filters are applied. A frozen initial point-in-time snapshot and a deterministic canonical document per post isolate pagination from new posts, updates and legacy duplicate records. Start a new request without a cursor to see new data. Continue until next_cursor is null: the bounded duplicate-scan budget can produce a short or empty page with a continuation. Cursors inherit all original options, expire after five idle minutes, and cannot outlive the one-hour snapshot. Unknown, repeated or empty options, tampering, and changed options are rejected. One credit is charged for each successful page, including an empty terminal page; validation, expired-cursor and upstream failures are not charged.","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Positive safe-integer Bitcointalk profile ID.","schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"example":1978649},{"name":"limit","in":"query","required":false,"description":"Maximum full posts per page (default 50). A bounded duplicate scan can return fewer or zero posts while next_cursor is still present.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"example":50},{"name":"order","in":"query","required":false,"description":"Chronological order; asc (oldest first) is the default. Ties use a stable post-ID order.","schema":{"type":"string","enum":["asc","desc"],"default":"asc"},"example":"asc"},{"name":"date_from","in":"query","required":false,"description":"Inclusive posting-time boundary. Exact YYYY-MM-DD means UTC midnight; alternatively use RFC3339 with an explicit timezone and at most millisecond precision.","schema":{"type":"string"},"example":"2026-09-09"},{"name":"date_to","in":"query","required":false,"description":"Exclusive posting-time boundary, using the same date syntax. For all of September 9 UTC, use date_from=2026-09-09 and date_to=2026-09-10.","schema":{"type":"string"},"example":"2026-09-10"},{"name":"board_id","in":"query","required":false,"description":"Restrict to one Bitcointalk board ID; supported on both collection endpoints.","schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"example":84},{"name":"topic_id","in":"query","required":false,"description":"Profile posts only: restrict the author’s posts to one topic ID.","schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"example":5480200},{"name":"cursor","in":"query","required":false,"description":"Opaque signed continuation token from next_cursor. Send it unchanged. Cursor-only requests inherit the original filters, order and limit; explicitly repeated options must be identical. Never construct a cursor or increment post IDs.","schema":{"type":"string","maxLength":4096},"example":"opaque_payload.opaque_signature"}],"responses":{"200":{"description":"One page returned and one credit charged. No indexed posts returns an empty data array, not 404.","headers":{"X-Request-Id":{"schema":{"type":"string","format":"uuid"},"description":"Request identifier for support and tracing."},"X-Credits-Charged":{"schema":{"type":"integer","example":1}},"X-Credits-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Limit":{"schema":{"type":"integer","example":120}},"X-RateLimit-Remaining":{"schema":{"type":"integer","minimum":0}},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix timestamp when the rate window resets."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostList"},"example":{"object":"post_list","scope":{"type":"profile","id":1978649},"order":"asc","limit":50,"filters":{"date_from":"2026-09-09T00:00:00.000Z","date_to":null,"board_id":null,"author_uid":null,"topic_id":null},"snapshot_at":"2026-09-26T12:00:00.000Z","cursor_expires_at":"2026-09-26T12:05:00.000Z","has_more":true,"next_cursor":"opaque_payload.opaque_signature","data":[{"object":"post","post_id":67000001,"topic_id":5480200,"post_number":2,"is_op":false,"title":"Example topic","author":{"profile_id":1978649,"username":"Best.Change","url":"https://bitcointalk.org/index.php?action=profile;u=1978649"},"board":{"board_id":84,"name":"Service Announcements"},"language":"en","posted_at":"2026-09-09T12:30:00.000Z","url":"https://bitcointalk.org/index.php?topic=5480200.msg67000001#msg67000001","topic_url":"https://bitcointalk.org/index.php?topic=5480200.0","content_html":"<p>Illustrative indexed post content.</p>","indexed_at":"2026-09-26T11:59:00.000Z","merit":{"total":0,"distinct_senders":0,"transactions":0,"observed_at":null}}]}}}},"400":{"description":"Invalid request parameters. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"401":{"description":"Missing, invalid, expired, or revoked API key. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"402":{"description":"Insufficient prepaid credits.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"403":{"description":"Source IP is not permitted by the key allowlist. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"404":{"description":"Resource not found in the indexed corpus. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"410":{"description":"Cursor or snapshot expired. No credit is charged; restart without a cursor.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"429":{"description":"Rate limit exceeded. No credit is charged.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}},"503":{"description":"Operation did not complete and the credit was restored.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"TalkSearch API key","description":"Use Authorization: Bearer ts_live_your_key. Keys may expire and may be restricted to IPv4/IPv6 addresses or CIDR ranges."},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Alternative header for a TalkSearch API key."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"requestId":{"type":"string","format":"uuid"},"creditsCharged":{"type":"integer","minimum":0,"maximum":1},"sourceIp":{"type":["string","null"],"description":"The client address seen by TalkSearch when an IP-restricted key is denied."},"topupUrl":{"type":"string","format":"uri"}},"additionalProperties":true},"Author":{"type":"object","required":["profile_id","username","url"],"properties":{"profile_id":{"type":["integer","null"]},"username":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}}},"Board":{"type":"object","required":["board_id","name"],"properties":{"board_id":{"type":["integer","null"]},"name":{"type":"string"}}},"Merit":{"type":"object","required":["total","distinct_senders","transactions","observed_at"],"properties":{"total":{"type":"integer","minimum":0},"distinct_senders":{"type":"integer","minimum":0},"transactions":{"type":"integer","minimum":0},"observed_at":{"type":["string","null"],"format":"date-time"}}},"PostSummary":{"type":"object","required":["post_id","topic_id","is_op","title","author","board","url","topic_url"],"properties":{"post_id":{"type":"integer"},"topic_id":{"type":"integer"},"post_number":{"type":["integer","null"]},"is_op":{"type":"boolean"},"title":{"type":"string"},"author":{"type":"object","required":["profile_id","username","url"],"properties":{"profile_id":{"type":["integer","null"]},"username":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}}},"board":{"type":"object","required":["board_id","name"],"properties":{"board_id":{"type":["integer","null"]},"name":{"type":"string"}}},"language":{"type":["string","null"]},"posted_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"},"topic_url":{"type":"string","format":"uri"}}},"Post":{"allOf":[{"type":"object","required":["post_id","topic_id","is_op","title","author","board","url","topic_url"],"properties":{"post_id":{"type":"integer"},"topic_id":{"type":"integer"},"post_number":{"type":["integer","null"]},"is_op":{"type":"boolean"},"title":{"type":"string"},"author":{"type":"object","required":["profile_id","username","url"],"properties":{"profile_id":{"type":["integer","null"]},"username":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}}},"board":{"type":"object","required":["board_id","name"],"properties":{"board_id":{"type":["integer","null"]},"name":{"type":"string"}}},"language":{"type":["string","null"]},"posted_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"},"topic_url":{"type":"string","format":"uri"}}},{"type":"object","required":["object","content_html","indexed_at","merit"],"properties":{"object":{"const":"post"},"content_html":{"type":"string","description":"Rendered post HTML. Cached images use cdn.talksearch.io URLs."},"indexed_at":{"type":["string","null"],"format":"date-time"},"merit":{"type":"object","required":["total","distinct_senders","transactions","observed_at"],"properties":{"total":{"type":"integer","minimum":0},"distinct_senders":{"type":"integer","minimum":0},"transactions":{"type":"integer","minimum":0},"observed_at":{"type":["string","null"],"format":"date-time"}}}}}]},"Topic":{"type":"object","required":["object","topic_id","title","board","post_count","page_count","views","merit","url","first_post","latest_post"],"properties":{"object":{"const":"topic"},"topic_id":{"type":"integer"},"title":{"type":"string"},"board":{"type":"object","required":["board_id","name"],"properties":{"board_id":{"type":["integer","null"]},"name":{"type":"string"}}},"language":{"type":["string","null"]},"created_at":{"type":["string","null"],"format":"date-time"},"last_post_at":{"type":["string","null"],"format":"date-time"},"post_count":{"type":"integer","minimum":0},"page_count":{"type":"integer","minimum":0},"views":{"type":"object","required":["observed","observed_at"],"properties":{"observed":{"type":"integer","minimum":0},"observed_at":{"type":["string","null"],"format":"date-time"}}},"merit":{"type":"object","required":["total","distinct_senders","transactions","observed_at"],"properties":{"total":{"type":"integer","minimum":0},"distinct_senders":{"type":"integer","minimum":0},"transactions":{"type":"integer","minimum":0},"observed_at":{"type":["string","null"],"format":"date-time"}}},"url":{"type":"string","format":"uri"},"first_post":{"anyOf":[{"allOf":[{"type":"object","required":["post_id","topic_id","is_op","title","author","board","url","topic_url"],"properties":{"post_id":{"type":"integer"},"topic_id":{"type":"integer"},"post_number":{"type":["integer","null"]},"is_op":{"type":"boolean"},"title":{"type":"string"},"author":{"type":"object","required":["profile_id","username","url"],"properties":{"profile_id":{"type":["integer","null"]},"username":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}}},"board":{"type":"object","required":["board_id","name"],"properties":{"board_id":{"type":["integer","null"]},"name":{"type":"string"}}},"language":{"type":["string","null"]},"posted_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"},"topic_url":{"type":"string","format":"uri"}}},{"type":"object","required":["object","content_html","indexed_at","merit"],"properties":{"object":{"const":"post"},"content_html":{"type":"string","description":"Rendered post HTML. Cached images use cdn.talksearch.io URLs."},"indexed_at":{"type":["string","null"],"format":"date-time"},"merit":{"type":"object","required":["total","distinct_senders","transactions","observed_at"],"properties":{"total":{"type":"integer","minimum":0},"distinct_senders":{"type":"integer","minimum":0},"transactions":{"type":"integer","minimum":0},"observed_at":{"type":["string","null"],"format":"date-time"}}}}}]},{"type":"null"}]},"latest_post":{"anyOf":[{"type":"object","required":["post_id","topic_id","is_op","title","author","board","url","topic_url"],"properties":{"post_id":{"type":"integer"},"topic_id":{"type":"integer"},"post_number":{"type":["integer","null"]},"is_op":{"type":"boolean"},"title":{"type":"string"},"author":{"type":"object","required":["profile_id","username","url"],"properties":{"profile_id":{"type":["integer","null"]},"username":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}}},"board":{"type":"object","required":["board_id","name"],"properties":{"board_id":{"type":["integer","null"]},"name":{"type":"string"}}},"language":{"type":["string","null"]},"posted_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"},"topic_url":{"type":"string","format":"uri"}}},{"type":"null"}]}}},"Profile":{"type":"object","required":["object","profile_id","username","url","corpus","recent_posts"],"properties":{"object":{"const":"profile"},"profile_id":{"type":"integer"},"username":{"type":["string","null"]},"url":{"type":"string","format":"uri"},"corpus":{"type":"object","required":["post_count","topic_count","first_post_at","last_post_at","derived_from"],"properties":{"post_count":{"type":"integer","minimum":0},"topic_count":{"type":"integer","minimum":0},"first_post_at":{"type":["string","null"],"format":"date-time"},"last_post_at":{"type":["string","null"],"format":"date-time"},"derived_from":{"const":"distinct indexed posts"}}},"recent_posts":{"type":"array","items":{"type":"object","required":["post_id","topic_id","is_op","title","author","board","url","topic_url"],"properties":{"post_id":{"type":"integer"},"topic_id":{"type":"integer"},"post_number":{"type":["integer","null"]},"is_op":{"type":"boolean"},"title":{"type":"string"},"author":{"type":"object","required":["profile_id","username","url"],"properties":{"profile_id":{"type":["integer","null"]},"username":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}}},"board":{"type":"object","required":["board_id","name"],"properties":{"board_id":{"type":["integer","null"]},"name":{"type":"string"}}},"language":{"type":["string","null"]},"posted_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"},"topic_url":{"type":"string","format":"uri"}}}}}},"SearchHit":{"type":"object","required":["post_id","topic_id","title","content","author","date","lang","score"],"properties":{"post_id":{"type":"integer"},"topic_id":{"type":"integer"},"title":{"type":"string"},"topic_title":{"type":"string"},"post_title":{"type":["string","null"]},"content":{"type":"string","description":"Rendered searchable post content. Cached images use cdn.talksearch.io URLs."},"author":{"type":"string"},"author_uid":{"type":"integer"},"date":{"type":"string","format":"date-time"},"board_id":{"type":"integer"},"board_name":{"type":"string"},"lang":{"type":"string"},"highlight":{"type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"string"}}},"score":{"type":"number"},"spam_score":{"type":"number"},"ai_score":{"type":"number"},"health_score":{"type":"number"},"rank_source":{"type":"string"},"ranking_model_version":{"type":"string"},"search_index":{"type":"string"}},"additionalProperties":true},"SearchResponse":{"type":"object","required":["query","lang","total","hits"],"properties":{"query":{"type":"string"},"corrected_query":{"type":["string","null"]},"lang":{"type":"string"},"board_scope":{"type":"string"},"index":{"type":"string"},"did_you_mean":{"type":["string","null"]},"hybrid":{"type":"boolean"},"freshness":{"type":"boolean"},"answer_seeking":{"type":"boolean"},"total":{"type":"integer","minimum":0},"hits":{"type":"array","items":{"type":"object","required":["post_id","topic_id","title","content","author","date","lang","score"],"properties":{"post_id":{"type":"integer"},"topic_id":{"type":"integer"},"title":{"type":"string"},"topic_title":{"type":"string"},"post_title":{"type":["string","null"]},"content":{"type":"string","description":"Rendered searchable post content. Cached images use cdn.talksearch.io URLs."},"author":{"type":"string"},"author_uid":{"type":"integer"},"date":{"type":"string","format":"date-time"},"board_id":{"type":"integer"},"board_name":{"type":"string"},"lang":{"type":"string"},"highlight":{"type":["object","null"],"additionalProperties":{"type":"array","items":{"type":"string"}}},"score":{"type":"number"},"spam_score":{"type":"number"},"ai_score":{"type":"number"},"health_score":{"type":"number"},"rank_source":{"type":"string"},"ranking_model_version":{"type":"string"},"search_index":{"type":"string"}},"additionalProperties":true}}},"additionalProperties":true},"Image":{"type":"object","required":["object","sha256","url","mime_type","bytes","nsfw_score","post"],"properties":{"object":{"const":"image"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"url":{"type":"string","format":"uri","description":"Stable TalkSearch CDN URL."},"mime_type":{"const":"image/avif"},"bytes":{"type":"integer","minimum":0},"nsfw_score":{"type":["number","null"],"minimum":0,"maximum":1},"post":{"type":"object","required":["post_id","topic_id","is_op","title","author","board","url","topic_url"],"properties":{"post_id":{"type":"integer"},"topic_id":{"type":"integer"},"post_number":{"type":["integer","null"]},"is_op":{"type":"boolean"},"title":{"type":"string"},"author":{"type":"object","required":["profile_id","username","url"],"properties":{"profile_id":{"type":["integer","null"]},"username":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}}},"board":{"type":"object","required":["board_id","name"],"properties":{"board_id":{"type":["integer","null"]},"name":{"type":"string"}}},"language":{"type":["string","null"]},"posted_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"},"topic_url":{"type":"string","format":"uri"}}}}},"ImageSearchResponse":{"type":"object","required":["object","query","lang","hide_nsfw","post_matches_considered","total","images"],"properties":{"object":{"const":"image_search"},"query":{"type":"string"},"corrected_query":{"type":["string","null"]},"lang":{"type":"string"},"board_scope":{"type":"string"},"hide_nsfw":{"type":"boolean"},"post_matches_considered":{"type":"integer","minimum":0},"total":{"type":"integer","minimum":0},"images":{"type":"array","items":{"type":"object","required":["object","sha256","url","mime_type","bytes","nsfw_score","post"],"properties":{"object":{"const":"image"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"url":{"type":"string","format":"uri","description":"Stable TalkSearch CDN URL."},"mime_type":{"const":"image/avif"},"bytes":{"type":"integer","minimum":0},"nsfw_score":{"type":["number","null"],"minimum":0,"maximum":1},"post":{"type":"object","required":["post_id","topic_id","is_op","title","author","board","url","topic_url"],"properties":{"post_id":{"type":"integer"},"topic_id":{"type":"integer"},"post_number":{"type":["integer","null"]},"is_op":{"type":"boolean"},"title":{"type":"string"},"author":{"type":"object","required":["profile_id","username","url"],"properties":{"profile_id":{"type":["integer","null"]},"username":{"type":"string"},"url":{"type":["string","null"],"format":"uri"}}},"board":{"type":"object","required":["board_id","name"],"properties":{"board_id":{"type":["integer","null"]},"name":{"type":"string"}}},"language":{"type":["string","null"]},"posted_at":{"type":["string","null"],"format":"date-time"},"url":{"type":"string","format":"uri"},"topic_url":{"type":"string","format":"uri"}}}}}}}},"PostList":{"type":"object","required":["object","scope","order","limit","filters","snapshot_at","cursor_expires_at","has_more","next_cursor","data"],"properties":{"object":{"const":"post_list"},"scope":{"type":"object","required":["type","id"],"properties":{"type":{"type":"string","enum":["topic","profile"]},"id":{"type":"integer","minimum":1,"maximum":9007199254740991}}},"order":{"type":"string","enum":["asc","desc"]},"limit":{"type":"integer","minimum":1,"maximum":100},"filters":{"type":"object","required":["date_from","date_to","board_id","author_uid","topic_id"],"properties":{"date_from":{"type":["string","null"],"format":"date-time"},"date_to":{"type":["string","null"],"format":"date-time"},"board_id":{"type":["integer","null"],"minimum":1,"maximum":9007199254740991},"author_uid":{"type":["integer","null"],"minimum":1,"maximum":9007199254740991},"topic_id":{"type":["integer","null"],"minimum":1,"maximum":9007199254740991}}},"snapshot_at":{"type":"string","format":"date-time","description":"Creation time of the frozen indexed-corpus snapshot."},"cursor_expires_at":{"type":["string","null"],"format":"date-time","description":"Next cursor expiry, or null when pagination is complete. Idle lifetime is five minutes; the snapshot lasts at most one hour."},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"],"maxLength":4096,"description":"Continue until this is null, even if data is empty. Treat a non-null token as opaque."},"data":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/Post"},"description":"Full canonical post records; no ranked-search snippets or approximate total."}}}}}}