{"openapi":"3.1.0","info":{"title":"TalkSearch API","version":"1.1.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."}],"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}}}}}}}},"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"}}}}}}}}}}}