Datasets API endpoint
Searches the journalists index (dataset id enum value `journalists`) — public journalist and reporter records crawled from news outlets' own staff/author pages, for PR outreach. Each record carries the outlet, title, best-effort beat topics, and any public contact info found on that outlet's own page, plus deterministic record_type, role_type, email_kind, and outreach-readiness quality signals. There is no cross-outlet upstream search; this dataset is built by crawling a curated roster of outlets ourselves. vertical enum: `tech`, `crypto`, `marketing`, `consumer_tech`, `consumer_policy`, `cybersecurity`, `health`, `gaming`, `climate`, `business`, `entertainment`, `sports`, `legal`, `science`, `politics`, `real_estate`, `automotive`, `travel`, `food`, `education`, `design`, `film_tv`, `fashion`, `music`, `personal_finance`, `tech_independent`, `culture_independent`, `local_news`, `construction`, `banking`, `retail`, `aerospace_defense`, `energy`, `agriculture`, `local_business`. contact_type enum: `email`, `social`, `none`. record_type enum: `person`, `desk`, `organization`, `syndicated_byline`, `unknown`. role_type enum: `staff`, `editor`, `reporter`, `contributor`, `freelancer`, `columnist`, `non_editorial`, `unknown`. email_kind enum: `individual_work`, `individual_personal_public`, `shared_desk`, `tips_or_submissions`, `outlet_generic`, `unknown`. sort enum: `relevance`, `name_asc`, `outlet_asc`, `crawled_desc`, `readiness_desc`. Billing: this search costs 1 credit per record returned, with a minimum of 2 (an empty result costs 2, a full page of 100 costs 100).
/datasets/journalists/searchDataset id enum:
journalistsQuery parameters:
q: optional full-text match on the journalist's name, title, and bio, max 256 characters.outlet: optional exact outlet id filter, e.g. techcrunch, coindesk. Use the ids returned by facets?facet=outlet.vertical: optional exact beat-vertical filter. Allowed values: tech, crypto, marketing, consumer_tech, consumer_policy, cybersecurity, health, gaming, climate, business, entertainment, sports, legal, science, politics, real_estate, automotive, travel, food, education, design, film_tv, fashion, music, personal_finance, tech_independent, culture_independent, local_news, construction, banking, retail, aerospace_defense, energy, agriculture, local_business, general_news.topic: optional exact topic filter, e.g. security, stablecoins. Use the values returned by facets?facet=topic.contact_type: optional contact-availability filter. Allowed values: email, social, none.record_type: optional record classification filter. Allowed values: person, desk, organization, syndicated_byline, unknown.role_type: optional role classification filter. Allowed values: staff, editor, reporter, contributor, freelancer, columnist, non_editorial, unknown.email_kind: optional email semantics filter. Allowed values: individual_work, individual_personal_public, shared_desk, tips_or_submissions, outlet_generic, unknown.min_outreach_readiness: optional minimum outreach-readiness score from 0 to 100. Use this to build a shortlist with a minimum contact quality threshold.sort: optional sort order. Allowed values: relevance, name_asc, outlet_asc, crawled_desc, readiness_desc. Defaults to relevance with q, otherwise outlet_asc.page: optional page number, defaults to 1.page_size: optional page size, defaults to 20 and maxes at 100.Response behavior:
outlet_id, outlet, outlet_domain, vertical, slug, name, normalized_name, title, bio, topics, profile_url, contact_email, email_domain, social_links, contact_type, record_type, role_type, email_kind, contact_source_url, outreach_readiness_score, outreach_readiness_band, outreach_readiness_reasons, outreach_quality_version, and crawled_at when present.contact_type says whether any email or social contact was published. email_kind adds semantics: individual_work, individual_personal_public, shared_desk, tips_or_submissions, or outlet_generic. Do not treat every contact_type=email record as a verified individual work address.record_type, role_type, and email_kind are deterministic quality signals derived from the published name, title, profile URL, and email. Keep the raw fields and contact_source_url for review.outreach_readiness_score is a deterministic 0–100 prioritization heuristic, not a guarantee that a person will respond. It rewards a person record, an editorial role, an individual work email, a public outlet desk or tips address, social/profile evidence, and useful title/bio/topic signals. outreach_readiness_band is ready (75+), promising (50–74), limited (25–49), or no_contact (<25). outreach_readiness_reasons explains important missing or positive signals. The ready band is reserved for confirmed editorial roles (editor, reporter, contributor, freelancer, columnist): other people records (staff, unknown) are capped at 74 with the reason unconfirmed_editorial_role, and non_editorial records are capped at 49 with the reason non_editorial_role.10000; page * page_size must not exceed 10000.items array (not an error) when nothing matches or the dataset has no data yet.1 credit per record returned, minimum 2. A search that returns 20 records costs 20 credits, a full page of 100 costs 100, and an empty or one-record result costs 2. You are charged for what comes back, not for the page_size you ask for, but your balance must cover the requested page_size for the call to be accepted. The response header x-credit-cost shows what a call was charged.
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| outlet_id | 20 | |
| outlet | 20 | |
| outlet_domain | 20 | |
| vertical | 20 | |
| slug | 20 | |
| name | 20 | |
| title | 18 | |
| bio | 20 | median 292 characters |
| profile_url | 20 | techcrunch.com |
| social_links | 16 | |
| contact_type | 20 | |
| normalized_name | 20 | |
| record_type | 20 | |
| role_type | 20 | |
| contact_source_url | 19 | techcrunch.com |
| outreach_readiness_score | 20 | 33 to 100, median 88 |
| outreach_readiness_band | 20 | |
| outreach_readiness_reasons | 20 | median 6 entries |
| outreach_quality_version | 20 | |
| crawled_at | 20 | 2026-08-31 to 2026-10-05 |
| topics | 7 | median 1 entry |
| contact_email | 13 | |
| email_kind | 13 | |
| email_domain | 13 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | No | Full-text match on the journalist's name, title, and bio, max 256 characters | ||
| outlet | string | No | Exact outlet id filter, e.g. techcrunch, coindesk. Use the ids returned by facets?facet=outlet | ||
| vertical | string | No | Exact beat-vertical filter. Enum: tech, crypto, marketing, consumer_tech, consumer_policy, cybersecurity, health, gaming, climate, business, entertainment, sports, legal, science, politics, real_estate, automotive, travel, food, education, design, film_tv, fashion, music, personal_finance, tech_independent, culture_independent, local_news, construction, banking, retail, aerospace_defense, energy, agriculture, local_business, general_news Allowed values: tech, crypto, marketing, consumer_tech, consumer_policy, cybersecurity, health, gaming, climate, business, entertainment, sports, legal, science, politics, real_estate, automotive, travel, food, education, design, film_tv, fashion, music, personal_finance, tech_independent, culture_independent, local_news, construction, banking, retail, aerospace_defense, energy, agriculture, local_business, general_news. | ||
| topic | string | No | Exact topic filter, e.g. security, stablecoins. Use the values returned by facets?facet=topic | ||
| contact_type | string | No | Contact-availability filter. Enum: email, social, none Allowed values: email, social, none. | ||
| record_type | string | No | Record classification filter. Enum: person, desk, organization, syndicated_byline, unknown Allowed values: person, desk, organization, syndicated_byline, unknown. | ||
| role_type | string | No | Role classification filter. Enum: staff, editor, reporter, contributor, freelancer, columnist, non_editorial, unknown Allowed values: staff, editor, reporter, contributor, freelancer, columnist, non_editorial, unknown. | ||
| email_kind | string | No | Email semantics filter. Enum: individual_work, individual_personal_public, shared_desk, tips_or_submissions, outlet_generic, unknown Allowed values: individual_work, individual_personal_public, shared_desk, tips_or_submissions, outlet_generic, unknown. | ||
| min_outreach_readiness | integer | No | Minimum outreach-readiness score, from 0 to 100 | ||
| sort | string | No | Sort enum: relevance, name_asc, outlet_asc, crawled_desc, readiness_desc Allowed values: relevance, name_asc, outlet_asc, crawled_desc, readiness_desc. | ||
| page | integer | No | 1 | Page number, defaults to 1 | |
| page_size | integer | No | 20 and maxes at 100 | Page size, defaults to 20 and maxes at 100; page * page_size must be <= 10000 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/datasets/journalists/search?q=coffee&vertical=tech&contact_type=email&record_type=person&role_type=staff&email_kind=individual_work&sort=relevance&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"dataset": "journalists",
"items": [
{
"outlet_id": "techcrunch",
"outlet": "TechCrunch",
"outlet_domain": "techcrunch.com",
"vertical": "tech",
"slug": "zack-whittaker",
"name": "Zack Whittaker",
"title": "Security Editor",
"bio": "Zack Whittaker is the security editor at TechCrunch...",
"topics": [
"security"
],
"profile_url": "https://techcrunch.com/author/zack-whittaker/",
"contact_email": "zack.whittaker@techcrunch.com",
"social_links": {
"signal": "zackwhittaker.1337",
"bluesky": "https://bsky.app/profile/zackwhittaker.com"
},
"contact_type": "email",
"normalized_name": "Zack Whittaker",
"record_type": "person",
"role_type": "editor",
"email_kind": "individual_work",
"email_domain": "techcrunch.com",
"contact_source_url": "https://techcrunch.com/author/zack-whittaker/",
"outreach_readiness_score": 98,
"outreach_readiness_band": "ready",
"outreach_readiness_reasons": [
"person_record",
"editorial_role",
"individual_work_email",
"profile_source",
"title_signal",
"topic_signal"
],
"outreach_quality_version": 1,
"crawled_at": "2026-09-14T12:00:00Z"
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "outlet_asc"
}
}Request schema
No body schema
Response schema
#/definitions/datasets.journalistsSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.JournalistsSearchResponse | No | ||||
| data.dataset | string | No | ||||
| data.items | array | No | JournalistRecord record, 24 fields: bio, contact_email, contact_source_url, contact_type, crawled_at, email_domain, email_kind, name, normalized_name, outlet, outlet_domain, outlet_id and 12 more. Described under Journalist Dataset Item API. | |||
| data.page | integer | No | ||||
| data.page_size | integer | No | ||||
| data.sort | string | No | ||||
| data.total | integer | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/datasets/journalists/search?q=coffee&vertical=tech&contact_type=email&record_type=person&role_type=staff&email_kind=individual_work&sort=relevance&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"