Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.crustdata.com/llms.txt

Use this file to discover all available pages before exploring further.

Reference material for Search Jobs: common indexed fields, the full Job catalog, id semantics, aggregation bucket metadata, null behavior, and errors. For filter grammar and example queries, see Filters & recipes. For sorting, pagination, field selection, and aggregations, see Pagination & sorting.
Jobs ID cheat sheet. The Jobs APIs use three id concepts — keep them straight:
  • crustdata_job_id — the Crustdata job identifier. Returned on every Job. Use it as your dedupe key.
  • company.basic_info.crustdata_company_id — the Crustdata company identifier returned on every Job.
  • company.basic_info.company_id (filter alias) — the dot-path used in filters and aggregations.column for indexed Search Jobs. It points to the same integer as company.basic_info.crustdata_company_id. This alias is not sortable; for deterministic pagination, sort on metadata.date_added instead.
When you group_by on company.basic_info.company_id, each bucket also returns metadata.company_name, metadata.company_website_domain, and metadata.linkedin_id for labeling.

Common indexed fields

These are the indexed fields most often used in filters, sorts, and aggregations.column. This table is a summary of the most common paths, not an authoritative catalog. For the deeper field catalog — including id semantics, null handling, and bucket metadata — see the full Field reference below.
Company id filter alias. The filterable field path uses the short alias company.basic_info.company_id, but the response shape returns the same integer at company.basic_info.crustdata_company_id. They point to the same value. See Jobs IDs: a quick map.
FieldExample
job_details.title"Software Engineer"
job_details.category"Engineering", "Sales", "Operations", "Others"
job_details.workplace_type"Remote", "Hybrid", "On-site", ""
job_details.reposted_jobtrue / false
job_details.url"https://www.linkedin.com/jobs/view/4398377738"
Sending a filter on a non-indexed field returns 400 with Unsupported columns in conditions: ['...']. Sending an unsupported group_by column returns a similar error listing every supported aggregation column.

Field reference

This section covers the return shape, id semantics, aggregation bucket metadata, and the most important indexed field catalogs in one place.

Annotated full Job example

The code fence below uses jsonc because it includes inline // comments for annotation. Strip the comments before sending it to a strict JSON parser.
{
    "crustdata_job_id": 41053563, // stable job id (use as dedupe key)
    "job_details": {
        "job_id": 41053563, // mirrors crustdata_job_id
        "title": "Integration Engineer (AUNZ)",
        "category": "Engineering",
        "workplace_type": "",
        "url": "https://www.linkedin.com/jobs/view/4398377738",
        "reposted_job": false,
        "number_of_openings": 1,
    },
    "company": {
        "basic_info": {
            "crustdata_company_id": 631394, // filter with company.basic_info.company_id
            "name": "Stripe",
            "primary_domain": "stripe.com",
            "website": "https://stripe.com",
            "professional_network_id": "2135371",
            "industries": ["Technology, Information and Internet"],
        },
        "locations": {
            "country": "USA",
            "state": "California",
            "city": "South San Francisco",
            "street_address": "354 Oyster Point Blvd, South San Francisco, California, United States",
        },
        "headcount": {
            "total": 7234,
            "range": "5001-10000",
            "largest_headcount_country": "USA",
        },
        "followers": { "count": 1335688 },
        "revenue": {
            "estimated": {
                "lower_bound_usd": 500000000,
                "upper_bound_usd": 1000000000,
            },
            "public_markets": null,
            "acquisition_status": "",
        },
        "funding": {
            "total_investment_usd": 9440247725.0,
            "valuation_usd": 50000000000.0,
            "last_fundraise_date": "2026-03-09T00:00:00",
            "last_round_type": "secondary_market",
            "num_funding_rounds": 23,
            "investors": [
                "Sequoia Capital",
                "Andreessen Horowitz",
                "Founders Fund",
            ],
        },
        "competitors": {
            "websites": ["https://plaid.com", "https://paystack.com"],
        },
    },
    "location": {
        "raw": "Melbourne, Victoria, Australia",
        "city": "Melbourne",
        "district": null,
        "state": "Victoria",
        "country": "Australia",
        "pincode": null,
    },
    "content": {
        "description": "Stripe is a financial infrastructure platform for businesses...",
    },
    "metadata": {
        "date_added": "2026-04-07T11:37:29",
        "date_updated": "2026-04-08T00:00:00",
    },
}
Nulls are normal. Nested objects such as revenue.public_markets, location.district, location.pincode, and parts of company.funding can legitimately be null or missing.

Jobs IDs: a quick map

IDLives onPurpose
crustdata_job_idTop-level on each JobCrustdata job identifier. Use it as your dedupe key in your own store.
job_details.job_idInside Job.job_detailsSecondary job identifier. It currently mirrors crustdata_job_id and is kept for backwards compatibility.
company.basic_info.crustdata_company_idInside Job.company.basic_infoCrustdata company identifier returned on each row.
company.basic_info.company_idSearch filter / aggregation pathIndexed alias for the same company identifier. Use this in filters.field and aggregations.column.

Aggregation bucket metadata

When you group_by on company.basic_info.company_id, each bucket carries a metadata object whose keys use bucket-specific names rather than the Job response dot-paths:
Bucket metadata keyEquivalent Job valueNotes
company_namecompany.basic_info.namePlain company name.
company_website_domaincompany.basic_info.primary_domainPrimary website domain.
linkedin_idcompany.basic_info.professional_network_idPublic-profile identifier returned only inside aggregation buckets.
crustdata_company_idcompany.basic_info.crustdata_company_idCrustdata company id. Defined in the spec as nullable; the bucket key already carries this value.

Job identifiers

PathTypeFilterSortGroupReturnExample
crustdata_job_idinteger41053563
job_details.job_idinteger41053563

Job details (job_details.*)

PathTypeFilterSortGroupReturnExample
job_details.titlestring"Software Engineer"
job_details.categorystring"Engineering"
job_details.workplace_typestring"Remote", "Hybrid", "On-site", ""
job_details.reposted_jobbooleanfalse
job_details.urlstring"https://www.linkedin.com/jobs/view/4398377738"
job_details.number_of_openingsinteger1

Company basic info (company.basic_info.*)

PathTypeFilterSortGroupReturnExample
company.basic_info.company_idinteger631394
company.basic_info.crustdata_company_idinteger631394
company.basic_info.namestring"Stripe"
company.basic_info.primary_domainstring"stripe.com"
company.basic_info.websitestring"https://stripe.com"
company.basic_info.professional_network_idstring"2135371"
company.basic_info.industriesstring[]["Technology, Information and Internet"]
company.basic_info.company_id and company.basic_info.crustdata_company_id refer to the same integer. Use the short alias in filters and aggregations.column. The response shape writes the value under crustdata_company_id.

Company firmographics

Headcount (company.headcount.*)

PathTypeFilterSortGroupReturnExample
company.headcount.totalinteger14522
company.headcount.rangestring"5001-10000"
company.headcount.largest_headcount_countrystring"USA"

Followers (company.followers.*)

PathTypeFilterSortGroupReturnExample
company.followers.countinteger1335688

Revenue (company.revenue.*)

PathTypeFilterSortGroupReturnExample
company.revenue.estimated.lower_bound_usdinteger500000000
company.revenue.estimated.upper_bound_usdinteger1000000000
company.revenue.acquisition_statusstring""
company.revenue.public_markets.stock_symbolsstring[]["STRIPE"]
company.revenue.public_markets.fiscal_year_endstring""

Funding (company.funding.*)

PathTypeFilterSortGroupReturnExample
company.funding.total_investment_usdnumber9440247725.0
company.funding.valuation_usdnumber50000000000.0
company.funding.last_fundraise_datestring (ISO 8601)"2026-03-09T00:00:00"
company.funding.last_round_typestring"secondary_market"
company.funding.num_funding_roundsinteger23
company.funding.investorsstring[]["Sequoia Capital"]

Competitors and company locations

PathTypeFilterSortGroupReturnExample
company.competitors.websitesstring[]["https://plaid.com"]
company.locations.countrystring"USA"
company.locations.statestring"California"
company.locations.citystring"South San Francisco"
company.locations.street_addressstring"354 Oyster Point Blvd, ..."

Job location (location.*)

PathTypeFilterSortGroupReturnExample
location.rawstring"Melbourne, Victoria, Australia"
location.citystring"Melbourne"
location.districtstring"Southbank"
location.statestring"Victoria"
location.countrystring"Australia"
location.pincodestring"3006"
Country value normalization. location.country can appear as full names ("United States"), ISO-style short forms ("USA"), and occasional variants ("United States of America"). When filtering by country, either match multiple variants with in or pre-discover the exact indexed values by running a group_by on location.country.

Content (content.*)

PathTypeFilterSortGroupReturnExample
content.descriptionstring"Stripe is a financial infrastructure..."
Use the (.) operator on content.description to find listings by technology, skill, or keyword.

Metadata (metadata.*)

PathTypeFilterSortGroupReturnExample
metadata.date_addedstring (ISO 8601)"2026-04-07T11:37:29"
metadata.date_updatedstring (ISO 8601)"2026-04-08T00:00:00"

Null, blank, and sparse field behavior

Most Job fields are nullable in the spec and can legitimately be absent or empty.
  • Null or missing — the field is not present on a given Job.
  • Blank string "" — the field was present but had no indexable value (common for job_details.workplace_type). Treat blank as “unspecified”, not as the same thing as null.
  • Sparse nested objectscompany.funding, company.revenue, and company.competitors are often missing for smaller or private companies.
  • is_null / is_not_null operators are currently not implemented — request the field via fields and filter for null presence client-side.

Errors

StatusEnvelope shapeMeaning
400{ "error": { "type", "message", "metadata" } }Invalid request — unsupported filter column, unsupported aggregation column, limit out of range, or malformed body. error.type is invalid_request for validation failures and internal_error for unsupported-column checks.
401{ "message": "..." } (flat — not the error envelope)Unauthorized — the Authorization header is missing, malformed, or contains an invalid API key.
500{ "error": { "type", "message", "metadata" } }Internal server error — retry after a short delay.
401 uses a different response shape than 400/500. Parse the response based on HTTP status: 401 is a flat { "message": ... }, every other 4xx/5xx is the nested { "error": { "type", "message", "metadata" } } envelope.
{
    "error": {
        "type": "internal_error",
        "message": "Unsupported columns in conditions: ['invalid_field']",
        "metadata": []
    }
}

What’s next