# Crustdata — Orthogonal API

> Pay-per-use API on Orthogonal. Each call is billed to your Orthogonal balance.
> Base API: `https://mono.orthogonal.com/v1/run` · [llms.txt](https://mono.orthogonal.com/llms.txt) · [browse all APIs](https://mono.orthogonal.com/catalog)

Comprehensive B2B data platform providing firmographic data, growth metrics, people profiles, and web intelligence for companies worldwide.

**Verified:** yes

## Access

**Run API:** `POST https://mono.orthogonal.com/v1/run`
**Auth:** `Authorization: Bearer $ORTHOGONAL_API_KEY`
Get an API key at https://mono.orthogonal.com/account/keys

Every call goes through the unified Run API: send the API `slug`, the endpoint `path`, and the `query`/`body` parameters. The response is `{ "success": true, "price": "<usd>", "data": { ... } }`.

## Endpoints

### Gartner Reviews

Get Gartner Peer Insights review data for companies. Filter by review rating, company ID, and other metrics. Returns a fields-and-rows structure. Note: requires Crustdata credits for this dataset. Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request.

`POST /data_lab/gartner_reviews/Table/`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `dataset` | object | Yes | Must be {"name": "gartner_reviews", "id": "gartnerreview"}. |
| `filters` | object | Yes | Filter object: {"op": "and", "conditions": [...]}. Each condition: {"column": "...", "type": "...", "value": ...}. Key columns: gartner_review_overall_rating (type: "=>", value: "4"), company_id (type: "in", value: [...]). Types: "in", "=>", "<=", "=". |
| `offset` | integer | No | Pagination offset. Default: 0. For later offset pages of the same logical search, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. |
| `limit` | integer | No | Number of results (max 100). Default: 100. |
| `sorts` | array | No | Sorting criteria. Usually empty []. |
| `tickers` | array | No | Ticker symbols. Usually empty []. |
| `groups` | array | No | Grouping. Usually empty []. |
| `aggregations` | array | No | Aggregations. Usually empty []. |
| `functions` | array | No | Functions. Usually empty []. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"crustdata","path":"/data_lab/gartner_reviews/Table/","body":{"dataset":"<object>","filters":"<object>","offset":"<integer>","limit":"<integer>","sorts":"<array>","tickers":"<array>","groups":"<array>","aggregations":"<array>","functions":"<array>"}}'
```

### Job Listings

Get job listings from Crustdata's database. Filter by company, date, location, and more. Returns a fields-and-rows structure where fields describe column names/types and rows contain the data. Use Company Identification endpoint first to get company_id values for filtering. Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request.

`POST /data_lab/job_listings/Table/`

**Estimated cost:** $0.313

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `dataset` | object | Yes | Must be {"name": "job_listings", "id": "joblisting"}. |
| `filters` | object | Yes | Filter object: {"op": "and", "conditions": [...]}. Each condition: {"column": "...", "type": "...", "value": ...}. Key columns: company_id (type: "in", value: [7576, 680992]), date_updated (type: ">", value: "2024-01-01"), job_title_name, job_location, remote_status. Types: "in", "not in", ">", "<", ">=", "<=", "=". |
| `offset` | integer | No | Pagination offset. Default: 0. For later offset pages of the same logical search, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. |
| `count` | integer | No | Number of rows to return (min: 1). Default: 100. |
| `sorts` | array | No | Sorting criteria array. Usually empty []. |
| `tickers` | array | No | Ticker symbols. Usually empty []. |
| `groups` | array | No | Grouping. Usually empty []. |
| `aggregations` | array | No | Aggregations. Usually empty []. |
| `functions` | array | No | Functions. Usually empty []. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"crustdata","path":"/data_lab/job_listings/Table/","body":{"dataset":"<object>","filters":"<object>","offset":"<integer>","count":"<integer>","sorts":"<array>","tickers":"<array>","groups":"<array>","aggregations":"<array>","functions":"<array>"}}'
```

### Company Identify

Resolve a company from partial info (name, domain, profile URL, or Crustdata ID) and get ranked matches with confidence scores. Replaces /screener/identify. Useful for entity resolution before enrichment. Up to 25 identifiers. Free.

`POST /company/identify`

**Cost:** Free

**Docs:** https://docs.crustdata.com/api-reference/company-apis/identify-a-company-from-name-domain-id-or-profile-url

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `names` | array | No | Array of names to look up. Provide exactly one identifier type. |
| `domains` | array | No | Array of domains to look up. Provide exactly one identifier type. |
| `crustdata_company_ids` | array | No | Array of crustdata company ids to look up. Provide exactly one identifier type. |
| `professional_network_profile_urls` | array | No | Array of professional network profile urls to look up. Provide exactly one identifier type. |
| `fields` | array | No | Field groups to include in `company_data`. Valid field groups: `crustdata_company_id`, `basic_info`, `social_profiles`. Identify resolves a company to its identity and basic profile only; requesting any other group returns `400 Invalid fields`. For `headcount`, `funding`, `people`, `hiring`, `revenue` and other sections, use `/company/enrich`. |
| `exact_match` | boolean | No | Whether to use exact matching (null means auto-detect) |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"crustdata","path":"/company/identify","body":{"names":"<array>","domains":"<array>","crustdata_company_ids":"<array>","professional_network_profile_urls":"<array>","fields":"<array>","exact_match":"<boolean>"}}'
```

### Job Search Autocomplete

Type-ahead value suggestions for a single /job/search field (e.g. title, category, company.name, location.country). Free.

`POST /job/search/autocomplete`

**Cost:** Free

**Docs:** https://docs.crustdata.com/api-reference/job-apis/autocomplete-values-for-a-job-search-field

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `field` | string | Yes | The `/job/search` field whose values to autocomplete. Accepts the same names used in `/job/search` filters, plus their short aliases. Common values: `title`, `category`, `company.name`, `company.industries`, `location.country`, `location.city`, `location.state`. Full set of supported fields: `category`, `city`, `company.basic_info.industries`, `company.basic_info.name`, `company.basic_info.primary_domain`, `company.funding.investors`, `company.funding.last_round_type`, `company.headcount.largest_country`, `company.headcount.range`, `company.industries`, `company.locations.city`, `company.locations.country`, `company.locations.state`, `company.name`, `company.revenue.acquisition_status`, `company.revenue.public_markets.fiscal_year_end`, `company.revenue.public_markets.stock_symbols`, `continent`, `country`, `country_code`, `district`, `fiscal_year_end`, `job_category`, `job_details.category`, `job_details.title`, `job_details.workplace_type`, `job_title`, `location`, `location.city`, `location.country`, `location.district`, `location.raw`, `location.state`, `locations.city`, `locations.country`, `locations.district`, `locations.location`, `locations.state`, `state`,... |
| `query` | string | Yes | Partial text to match against the field's values. May be an empty string to return top values. |
| `limit` | integer | No | Maximum number of suggestions to return. Must be between 1 and 100. (default: 20) |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"crustdata","path":"/job/search/autocomplete","body":{"field":"<string>","query":"<string>","limit":"<integer>"}}'
```

### Company Enrich

Get a full company profile (firmographics, headcount, funding, hiring, web traffic, reviews, people, news and more) by domain, name, profile URL, or Crustdata company ID. Replaces /screener/company. Provide exactly one identifier array. Only basic_info is returned unless you list field groups in `fields`. Billed per company.

`POST /company/enrich`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.crustdata.com/api-reference/company-apis/get-full-company-enrichment

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `names` | array | No | Array of names to look up. Provide exactly one identifier type. |
| `domains` | array | No | Array of domains to look up. Provide exactly one identifier type. |
| `crustdata_company_ids` | array | No | Array of crustdata company ids to look up. Provide exactly one identifier type. |
| `professional_network_profile_urls` | array | No | Array of professional network profile urls to look up. Provide exactly one identifier type. |
| `fields` | array | No | Field groups to include in `company_data`. When `fields` is omitted, only `crustdata_company_id` and `basic_info` are returned — sections such as `headcount`, `funding`, `people`, and `hiring` must be listed explicitly. Valid field groups for enrich: basic_info, revenue, headcount, funding, hiring, web_traffic, seo, competitors, employee_reviews, people, locations, taxonomy, followers, news, software_reviews, social_profiles, reviews, public_launches, market_intel, metadata, crustdata_company_id, updated_at, indexed_at. Also available: social_posts, which is never returned by default and must be requested explicitly. Not valid for enrich: roles, skills (search-only fields). |
| `exact_match` | boolean | No | Whether to use exact matching (null means auto-detect) |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"crustdata","path":"/company/enrich","body":{"names":"<array>","domains":"<array>","crustdata_company_ids":"<array>","professional_network_profile_urls":"<array>","fields":"<array>","exact_match":"<boolean>"}}'
```

### Company Search Autocomplete

Get field value suggestions with document counts for company search filter fields (e.g. basic_info.industries, locations.country). Use to discover valid filter values before calling /company/search. Free.

`POST /company/search/autocomplete`

**Cost:** Free

**Docs:** https://docs.crustdata.com/api-reference/company-apis/get-autocomplete-suggestions-for-company-search-fields

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `field` | string | Yes | The dataset API field name to get suggestions for. Valid fields include: basic_info.name, basic_info.primary_domain, basic_info.website, basic_info.professional_network_url, basic_info.professional_network_id, basic_info.company_type, basic_info.year_founded, basic_info.employee_count_range, basic_info.markets, basic_info.industries, revenue.estimated.lower_bound_usd, revenue.estimated.upper_bound_usd, revenue.acquisition_status, funding.total_investment_usd, funding.last_round_type, funding.last_fundraise_date, funding.investors, funding.tracxn_investors, headcount.latest_count, headcount.largest_headcount_country, locations.country, taxonomy.professional_network_industry, taxonomy.professional_network_specialities, taxonomy.categories, technographics.technologies.name, technographics.technologies.category, technographics.top_technologies, followers.latest_count, social_profiles.crunchbase.url, social_profiles.twitter_url, revenue.public_markets.stock_symbols, revenue.public_markets.fiscal_year_end. The dedicated field names technology (technology names) and technology_category (category slugs) are equivalent shorthands for the technographics paths. |
| `query` | string | Yes | The search query text (can be empty to get top values by frequency) |
| `limit` | integer | No | Maximum number of suggestions to return (default: 20) |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"crustdata","path":"/company/search/autocomplete","body":{"field":"<string>","query":"<string>","limit":"<integer>"}}'
```

### Person Enrich

Enrich person profiles by professional network profile URL (up to 25): employment history, education, skills, certifications, social handles and more. Replaces /screener/person/enrich. Billed per profile.

`POST /person/enrich`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.crustdata.com/api-reference/person-apis/enrich-person-profiles-from-cached-dataset

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `professional_network_profile_urls` | array | Yes | Array of professional-network profile URLs (max 25). |
| `fields` | array | No | Fields to include in the response. Valid field groups for enrich: basic_profile, professional_network, skills, social_handles, experience, education, certifications, honors, dev_platform_profiles, assessment, social_posts. Use dot-notation for nested fields (e.g., "basic_profile.name", "experience.employment_details"). If omitted, a default set (basic_profile, social_handles) is returned — request additional groups explicitly. Some groups (for example certifications and honors) require field-level permission on your API key. |
| `preview` | boolean | No | Preview mode returns only basic profile fields and charges 0 credits. Cannot be combined with enrich_realtime. Preview is **enterprise only** and must be enabled for your account — without it, the API returns `400 invalid_request` with the message `Preview feature is not available for your account. Please reach out to Crustdata team.` (default: false) |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"crustdata","path":"/person/enrich","body":{"professional_network_profile_urls":"<array>","fields":"<array>","preview":"<boolean>"}}'
```

### Person Search

Search Crustdata's person database with flexible filters (title, company, seniority, location, skills, education...), sorting, and cursor pagination. Supports normalized job titles and semantic search. Replaces /screener/persondb/search. Up to 1000 results per page. Billed per result returned (limit defaults to 20). Filter example: {"op": "and", "conditions": [{"field": "experience.employment_details.current.title", "type": "=", "value": "CTO"}, {"field": "experience.employment_details.current.company_headcount_range", "type": "in", "value": ["51-200"]}]}.

`POST /person/search`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.crustdata.com/api-reference/person-apis/search-people-using-filters-and-sorting

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `filters` | object | Yes | Filter criteria — a single `PersonSearchCondition` or a `PersonSearchConditionGroup` combining conditions with `and`, `or`, or `all_of` (cross-element matching on nested-array fields). |
| `sorts` | array | No | Sort directives applied to matched people in order. (default: []) |
| `limit` | integer | No | (default: 20) |
| `count` | integer | No | Alias for limit. |
| `cursor` | string | No | Pagination cursor from a previous response's `next_cursor`. Omit on the first page. |
| `post_processing` | object | No | Post-processing options applied to search results (e.g., exclusions). |
| `return_query` | boolean | No | Debug flag - include search query in response (default: false) |
| `preview` | boolean | No | Preview mode - return only basic fields for faster response (default: false) |
| `explain` | boolean | No | Explain an empty result. When true and a filters-only request returns `total_count` 0, `remarks` names the condition whose removal recovers profiles. Not the `search.explain` flag on semantic search, which returns per-hit scoring. (default: false) |
| `fields` | array | No | Optional list of field paths to include in each returned profile. When omitted, a default set of profile fields is returned. Use dot notation for a nested field (for example `experience.employment_details.current.title`) or a top-level family name (for example `basic_profile`) to include the whole family. An unsupported value returns a `400` whose `metadata.available_fields` lists every selectable field. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"crustdata","path":"/person/search","body":{"filters":"<object>","sorts":"<array>","limit":"<integer>","count":"<integer>","cursor":"<string>","post_processing":"<object>","return_query":"<boolean>","preview":"<boolean>","explain":"<boolean>","fields":"<array>"}}'
```

### Person Search Autocomplete

Get ranked field value suggestions for person search fields (e.g. experience.employment_details.current.title). Feed returned values verbatim into /person/search filters. Free.

`POST /person/search/autocomplete`

**Cost:** Free

**Docs:** https://docs.crustdata.com/api-reference/person-apis/get-autocomplete-suggestions-for-person-search-fields

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `field` | string | Yes | The dataset API field name to get suggestions for. Valid fields include: basic_profile.name, basic_profile.first_name, basic_profile.last_name, basic_profile.headline, basic_profile.languages, basic_profile.location, basic_profile.location.raw, basic_profile.location.full_location, basic_profile.location.city, basic_profile.location.state, basic_profile.location.country, basic_profile.location.continent, professional_network.location, professional_network.location.raw, professional_network.location.city, professional_network.location.state, professional_network.location.country, professional_network.location.continent, professional_network.open_to_cards, skills.professional_network_skills, experience.employment_details.current.name, experience.employment_details.current.title, experience.employment_details.current.seniority_level, experience.employment_details.current.function_category, experience.employment_details.current.company_industries, experience.employment_details.current.company_type, experience.employment_details.current.company_hq_location, experience.employment_details.current.company_website_domain, experience.employment_details.current.employment_type,... |
| `query` | string | Yes | The search query text (can be empty to get top values by frequency) |
| `limit` | integer | No | Maximum number of suggestions to return (default: 20) |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"crustdata","path":"/person/search/autocomplete","body":{"field":"<string>","query":"<string>","limit":"<integer>"}}'
```

### Job Search

Search Crustdata's indexed job listings with filters, sorting, cursor pagination, field selection, and aggregations. Each result includes job details, hiring company firmographics, location, and full description. Billed per result returned (limit defaults to 20).

`POST /job/search`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.crustdata.com/api-reference/job-apis/search-the-indexed-job-dataset

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `filters` | object | No | Search filter conditions. Can be a single condition or a nested group combined with AND/OR logic. Only indexed fields are filterable — see `SearchCondition.field` for the full list. |
| `cursor` | string | No | Opaque pagination cursor returned in a prior response's `next_cursor` field. Pass this to fetch the next page of results with the same filter, sort, and field selection. |
| `limit` | integer | No | Maximum number of job listings to return per page. Set to 0 when you only want aggregations. (default: 20) |
| `sorts` | array | No | Sort specifications for ordering results. Sorts are applied in order. |
| `fields` | array | No | Fields to return in each job listing. Use dot-notation for nested fields (e.g., "job_details.title", "company.basic_info.name"). If omitted, all available fields are returned. Valid top-level groups: `crustdata_job_id`, `job_details`, `company`, `location`, `content`, `metadata`. Nested fields are supported (e.g., `company.basic_info`, `company.headcount`, `company.funding`). |
| `aggregations` | array | No | Aggregation queries to run alongside the search. Set `limit: 0` if you want only aggregation results and no job rows. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"crustdata","path":"/job/search","body":{"filters":"<object>","cursor":"<string>","limit":"<integer>","sorts":"<array>","fields":"<array>","aggregations":"<array>"}}'
```

### Social Post Search

Search indexed social posts with filters on text, author, engagement, reactors, commenters, mentions, and attachments. Replaces /screener/linkedin_posts endpoints. Cursor pagination. Billed per post returned (limit defaults to 20).

`POST /social_post/search`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.crustdata.com/api-reference/social-post-apis/search-the-social-post-dataset

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `filters` | object | No | A single `SocialPostDbSearchCondition` or a nested `SocialPostDbSearchConditionGroup`. Omit to match every indexed post. |
| `cursor` | string | No | Opaque cursor from a prior response's `next_cursor`. Send the same `filters`, `sorts`, and `fields` with it; a cursor issued for a different body is rejected with `Invalid cursor`. |
| `limit` | integer | No | Posts per page. `0` returns `total_count` alone and costs nothing. (default: 20) |
| `sorts` | array | No | Ordering rules applied in array order. Defaults to `date_posted` descending. |
| `fields` | array | No | Dot-paths to include in each returned post, for example `actor.name` or a whole group such as `engagement`. Omit to return everything. `actor.location` and `reposter.location` are selected whole; their sub-keys are filterable but not selectable. `reactors` and `comments` are returned in full and can be long, so leave them out unless you need them. Filter-only fields (`content_type`, `materialized_at`) are rejected here. |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"crustdata","path":"/social_post/search","body":{"filters":"<object>","cursor":"<string>","limit":"<integer>","sorts":"<array>","fields":"<array>"}}'
```

### Web Search

Live web search across web, news, academic, social, and deep research sources, with location, site, and date filters. Billed per result page aggregated (page defaults to 1).

`POST /web/search/live`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.crustdata.com/api-reference/web-apis/web-search

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `query` | string | Yes | The search query text. Keep queries concise and specific for better results. Supports standard search operators (e.g., site:, filetype:). |
| `location` | string | No | ISO 3166-1 alpha-2 country code for location targeting. Use this to get region-specific search results. Valid values include US, CA, MX, BR, AR, CL, CO, PE, VE, GB, DE, FR, IT, ES, PT, NL, BE, CH, AT, PL, SE, NO, DK, FI, IE, RU, UA, CZ, GR, TR, RO, HU, JP, CN, KR, IN, ID, TH, VN, MY, SG, PH, TW, HK, SA, AE, IL, EG, AU, NZ, ZA, NG, KE. |
| `sources` | array | No | List of search sources to query. If omitted, all sources are searched. Use specific sources to narrow results. |
| `site` | string | No | Restrict search results to a specific site domain. For example, use "linkedin.com/company" to find company LinkedIn pages, or "site:github.com" for developer profiles. |
| `start_date` | integer | No | Unix timestamp (seconds since epoch) for the start date filter. Must be less than end_date if both are provided. |
| `end_date` | integer | No | Unix timestamp (seconds since epoch) for the end date filter. Must be greater than start_date if both are provided. |
| `human_mode` | boolean | No | Whether to use a browser-like retrieval path when standard access is blocked. (default: false) |
| `page` | integer | No | Number of search result pages to aggregate into a single response. Values above 15 are rejected with a 400. When greater than 1, `sources` must contain exactly one source. (default: 1) |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"crustdata","path":"/web/search/live","body":{"query":"<string>","location":"<string>","sources":"<array>","site":"<string>","start_date":"<integer>","end_date":"<integer>","human_mode":"<boolean>","page":"<integer>"}}'
```

### Web Fetch

Fetch the title and full HTML content for up to 10 public webpages by URL. Billed per URL.

`POST /web/enrich/live`

**Estimated cost:** Dynamic — use `"dryRun": true` in the Run API request to check the exact cost before calling.

**Docs:** https://docs.crustdata.com/api-reference/web-apis/web-fetch

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `urls` | array | Yes | List of URLs to fetch web content for. Each URL must include the protocol prefix (http:// or https://). Maximum of 10 URLs per request. |
| `human_mode` | boolean | No | Whether to use a browser-like retrieval path when standard access is blocked. (default: false) |

```bash
curl -X POST 'https://mono.orthogonal.com/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"crustdata","path":"/web/enrich/live","body":{"urls":"<array>","human_mode":"<boolean>"}}'
```

---

Full details and an interactive quickstart: https://mono.orthogonal.com/publisher/crustdata
