Python SDK Specification
Examples on this page match PyPI desearch-py==1.2.1. Do not call extract() on this release. Use web_crawl or REST GET /web/extract.
First AI Search call, with the same fields as the Search API guide: Extract API · Auth and API keys.
Install
Pin the version used in these examples:
Construct the client
Pass the raw API key from the environment. Do not hardcode production keys.
Do not pass streaming into ai_search. That argument is not in the current signature. For REST streaming, use the Streaming AI Search guide.
Extract / crawl
On 1.2.1, the extract family is web_crawl only:
Do not show or call desearch.extract(...) until PyPI ships it with evidence. REST alternative: GET /web/extract on the Extract API page.
Billing metadata
Read request cost from response headers. JSON object bodies may also include cost_usd, usage_count, service, and currency.
| Header | Meaning |
|---|---|
X-Desearch-Cost-Usd | Request cost in USD |
X-Desearch-Usage-Count | Billable usage units |
X-Desearch-Service | Pricing service key |
X-Desearch-Currency | Currency code |
Arrays, text responses, and streaming responses keep their body shape. Use headers for those. This page does not list dollar rates.
Errors
- Missing or invalid key:
401. - Validation failure:
4xxwith the API message. 429or5xx: retry with backoff.
Do not invent error JSON schemas beyond the API Reference.
Parity with JavaScript
| Capability | Python 1.2.1 | JavaScript 1.5.1 |
|---|---|---|
| AI Search | ai_search(...) | aiSearch({...}) |
| Extract page content | REST /web/extract or web_crawl | extract({...}) |
| Streaming helpers | Not on this package. Use REST (streaming guide) | Same |
| Billing fields on a JSON object | Read body and headers | Same |
| Billing on a stream | Headers only | Headers only |
| People Search (Python 1.4.0, JavaScript 1.6.0) | x_profile_search(...), youtube_creator_search(...), linkedin_profile_search(...), tiktok_creator_search(...) | xProfileSearch({...}), youtubeCreatorSearch({...}), linkedinProfileSearch({...}), tiktokCreatorSearch({...}) |
| Wait for a People Search task | wait_for_people_task(task_id) | waitForPeopleTask(task) |
| Read every People Search result | iter_people_results(task_id) | iterPeopleResultPages({ task_id }) |
People Search metadata labels (Python 1.5.0, JavaScript 1.7.0) | metadata={...} on the search methods and list_people_tasks | metadata: {...} in the search request and in listPeopleTasks |
Other methods already on this package
Web search:
X search:
People Search (1.4.0 and later)
People Search methods ship in desearch-py 1.4.0, and metadata labels in 1.5.0. The examples above match 1.2.1.
1.5.0 is not on PyPI yet. Until it is, install it from GitHub:
Once 1.5.0 is on PyPI, pip install "desearch-py>=1.5.0" works the same way. You can also call the People Search REST endpoints directly with any HTTP client: see People Search.
A search runs in the background. Start it, wait for it, then read or export the people it found:
| Method | Route |
|---|---|
x_profile_search, youtube_creator_search, linkedin_profile_search, tiktok_creator_search | POST /desearch/people/search/{x,youtube,linkedin,tiktok} (billed) |
list_people_tasks | GET /desearch/people/tasks |
get_people_task | GET /desearch/people/tasks/{task_id} |
get_people_results | GET /desearch/people/tasks/{task_id}/results |
pause_people_task, resume_people_task, cancel_people_task | POST /desearch/people/tasks/{task_id}/pause, /resume, /cancel |
export_people_results | GET /desearch/people/tasks/{task_id}/export |
list_people_profiles | GET /desearch/people/profiles |
export_people_profiles | GET /desearch/people/profiles/export |
wait_for_people_task | Polls get_people_task until the task ends |
iter_people_results | Follows next_cursor on get_people_results |
Search methods take query, count, min_score, exclude, and filters (XProfileSearchFilters, YouTubeCreatorSearchFilters, LinkedInProfileSearchFilters, TikTokCreatorSearchFilters, or a dict), plus metadata from 1.5.0 (below). idempotency_key is sent as the Idempotency-Key header. A 409 from pause, resume, or cancel raises PeopleTaskConflictError. A timeout in wait_for_people_task raises PeopleTaskTimeoutError; the search keeps running. Flow, filters, and billing: People Search.
Label searches with metadata (1.5.0 and later)
desearch-py 1.5.0 adds metadata to the four search methods and to list_people_tasks. Use it to tag each search with your own labels, such as the campaign, workspace, or customer it belongs to, and to list those searches later. The search itself never uses the labels.
The GitHub install above is 1.5.0, so it includes metadata.
task.metadatais{}for a search without labels.- A search takes up to 10 keys. Keys are 1 to 40 characters of
a-z,0-9,_,., or-, and values are strings of up to 200 characters. The SDK does not check them; the API answers422, raised asDesearchAPIError. list_people_taskssends each pair as ametadata.<key>=<value>query parameter, and a task must match all of them exactly. Pass up to 3 pairs (the API answers400otherwise), and pass the samemetadatawith eachcursorwhen you page.- This
metadatais the task's labels. It is not the cost wrapper thatinclude_metadata=Truereturns.