Exende Docs

Jobs Intelligence

Jobs Intelligence

Structured hiring intelligence for AI agents. Seven GET APIs on api.exende.dev, paid per request with x402. No API keys or subscriptions are required for individual x402 requests.

Updated October 19, 2026

Start with an unpaid request

Send a valid GET request to inspect its price and payment requirements. This curl command contains no payment authorization and spends no funds. HTTP 402 is the expected first response.

bash

Unpaid probe · expected HTTP 402

curl -i 'https://api.exende.dev/v1/jobs/search?keyword=engineer&limit=3'

Pay through x402

Use an x402 v2 client supporting exact USDC payments on Base Mainnet (eip155:8453) through EIP-3009. Read the current PAYMENT-REQUIRED challenge and verify its resource, amount, asset, network, and recipient. Sign a fresh authorization and repeat the exact request with PAYMENT-SIGNATURE. Successful settlement returns HTTP 200, the data, and PAYMENT-RESPONSE.

Permit2 is not supported for these routes. Invalid parameters are rejected before payment. A payment proof can be used only once; protect it as a sensitive authorization. If an outcome is ambiguous, reconcile the payment receipt before authorizing another payment. EIP-3009 signs payment details; it does not sign URL query parameters.

These routes share Exende’s existing Callback service and payment recipient. Use the live challenge for authoritative requirements. See the x402 payment guide.

GET · $0.05 USDC per request

Company Hiring Intelligence

GET /v1/jobs/company

Understand one company’s observed hiring activity, departments, and requested skills.

Parameters: company (required domain), period (7d).

Returns: Company name and domain, active and engineering job counts where coverage supports them, sample counts, top departments, skills, and freshness.

bash

Unpaid probe · no funds spent

curl -i 'https://api.exende.dev/v1/jobs/company?company=stripe.com&period=7d'
Synthetic JSON response example

Illustrative schema values, not live catalogue statistics.

json

Illustrative successful response

{
  "data": {
    "company": {
      "name": "Example",
      "domain": "example.com"
    },
    "active_job_count": 2,
    "observed_sample_jobs": 2,
    "engineering_jobs_in_sample": 2,
    "engineering_job_count": 2,
    "top_hiring_departments": [
      {
        "department": "Engineering",
        "observed_job_count": 2
      }
    ],
    "top_requested_skills": [
      {
        "skill": "TypeScript",
        "observed_job_count": 1,
        "sample_size": 2
      }
    ],
    "last_observed_at": "2026-10-18T00:00:00.000Z"
  },
  "meta": {
    "product": "EXENDE JOBS INTELLIGENCE",
    "generated_at": "2026-10-19T12:00:00.000Z",
    "observation_period": {
      "start": "2026-10-12T12:00:00.000Z",
      "end": "2026-10-19T12:00:00.000Z",
      "days": 7
    },
    "coverage": {
      "scope": "Exende monitored catalogue",
      "aggregation": "complete matching current catalogue",
      "sampled": false,
      "candidate_limit": 10000,
      "candidate_jobs": 2,
      "candidate_scope": "requested company",
      "selection": "most recently observed active jobs",
      "pagination_available": false
    },
    "methodology": {
      "version": "deterministic-v1",
      "current_jobs": "status=active; aggregates operate on at most 10000 indexed recent active jobs, scoped to the company when specified",
      "period": "Rolling seven-day UTC interval; current statistics describe the current catalogue.",
      "remote_false": "Only on_site jobs; hybrid and unknown are excluded."
    },
    "limitations": [
      "Synthetic documentation example generated from a local test fixture; not live hiring data.",
      "Statistics cover the Exende monitored catalogue, not the global labour market.",
      "Missing fields and unclassified workplace types are not inferred.",
      "Last observed timestamps may be coalesced to one observation per UTC day; they are not fetch timestamps.",
      "Current skill associations are deterministic title/description extractions, not a complete or historical skill census.",
      "A job no longer observed does not prove a hire. Collection gaps and source coverage can affect observations."
    ],
    "freshness": {
      "last_observed_at": "2026-10-18T00:00:00.000Z",
      "oldest_last_observed_at": "2026-10-18T00:00:00.000Z"
    }
  }
}

GET · $0.09 USDC per request

Hiring Signals

GET /v1/jobs/signals

Find up to five companies showing observed hiring activity, with deterministic scores and supporting evidence.

Parameters: role, location, department, period (7d), limit (1–5).

Returns: Company context, observed active and recently observed jobs, activity score, supporting evidence, and observation period. Scores describe observed activity, not company growth.

bash

Unpaid probe · no funds spent

curl -i 'https://api.exende.dev/v1/jobs/signals?role=engineer&period=7d&limit=5'
Synthetic JSON response example

Illustrative schema values, not live catalogue statistics.

json

Illustrative successful response

{
  "data": {
    "companies": [
      {
        "company": {
          "name": "Example",
          "domain": "example.com"
        },
        "active_jobs": 2,
        "observed_sample_jobs": 2,
        "recently_observed_jobs": 1,
        "hiring_activity_score": 50,
        "supporting_evidence": {
          "criterion": "Active matching jobs first observed during the period",
          "first_observed_jobs": 1,
          "matching_sample_jobs": 2,
          "scope": "matching catalogue"
        },
        "last_observed_at": "2026-10-18T00:00:00.000Z",
        "observation_period": {
          "start": "2026-10-12T12:00:00.000Z",
          "end": "2026-10-19T12:00:00.000Z",
          "days": 7
        }
      }
    ],
    "returned_companies": 1,
    "limit": 5,
    "matching_active_jobs": 2,
    "observed_sample_jobs": 2
  },
  "meta": {
    "product": "EXENDE JOBS INTELLIGENCE",
    "generated_at": "2026-10-19T12:00:00.000Z",
    "observation_period": {
      "start": "2026-10-12T12:00:00.000Z",
      "end": "2026-10-19T12:00:00.000Z",
      "days": 7
    },
    "coverage": {
      "scope": "Exende monitored catalogue",
      "aggregation": "complete matching current catalogue",
      "sampled": false,
      "candidate_limit": 10000,
      "candidate_jobs": 2,
      "candidate_scope": "monitored catalogue",
      "selection": "most recently observed active jobs",
      "pagination_available": false
    },
    "methodology": {
      "version": "deterministic-v1",
      "current_jobs": "status=active; aggregates operate on at most 10000 indexed recent active jobs, scoped to the company when specified",
      "period": "Rolling seven-day UTC interval; current statistics describe the current catalogue.",
      "remote_false": "Only on_site jobs; hybrid and unknown are excluded.",
      "hiring_activity_score": "round(100 * recently_observed_jobs / observed_sample_jobs, 2); recent means first_seen_at in the rolling 7-day period; score is 0 if observed_sample_jobs is 0."
    },
    "limitations": [
      "Synthetic documentation example generated from a local test fixture; not live hiring data.",
      "Statistics cover the Exende monitored catalogue, not the global labour market.",
      "Missing fields and unclassified workplace types are not inferred.",
      "Last observed timestamps may be coalesced to one observation per UTC day; they are not fetch timestamps.",
      "Current skill associations are deterministic title/description extractions, not a complete or historical skill census.",
      "A job no longer observed does not prove a hire. Collection gaps and source coverage can affect observations.",
      "Hiring activity score measures observed catalogue activity, not company growth; newly monitored sources can produce high scores."
    ],
    "freshness": {
      "last_observed_at": "2026-10-18T00:00:00.000Z",
      "oldest_last_observed_at": "2026-10-18T00:00:00.000Z"
    }
  }
}

GET · $0.04 USDC per request

Company Changes

GET /v1/jobs/changes

Compare a company’s observed hiring catalogue across seven days when sufficient history exists.

Parameters: company (required domain), period (7d).

Returns: Jobs entering or leaving the observed active catalogue, net observed change, and comparison timestamps. A disappearing listing does not prove a hire. Insufficient history returns HTTP 422.

bash

Unpaid probe · no funds spent

curl -i 'https://api.exende.dev/v1/jobs/changes?company=stripe.com&period=7d'
Synthetic JSON response example

Illustrative schema values, not live catalogue statistics.

json

Illustrative successful response

{
  "data": {
    "company": {
      "name": "Example",
      "domain": "example.com"
    },
    "status": "available",
    "newly_observed_jobs": 1,
    "no_longer_observed_jobs": 0,
    "net_observed_change": 1,
    "previous_observation": {
      "at": "2026-10-12T12:00:00.000Z",
      "active_jobs": 1
    },
    "latest_observation": {
      "at": "2026-10-19T12:00:00.000Z",
      "active_jobs": 2
    },
    "cohort_jobs": 2
  },
  "meta": {
    "product": "EXENDE JOBS INTELLIGENCE",
    "generated_at": "2026-10-19T12:00:00.000Z",
    "observation_period": {
      "start": "2026-10-12T12:00:00.000Z",
      "end": "2026-10-19T12:00:00.000Z",
      "days": 7
    },
    "coverage": {
      "scope": "Exende monitored catalogue",
      "aggregation": "complete matching current catalogue",
      "sampled": false,
      "candidate_limit": 10000,
      "candidate_jobs": 2,
      "candidate_scope": "requested company",
      "selection": "most recently observed active jobs",
      "pagination_available": false
    },
    "methodology": {
      "version": "deterministic-v1",
      "current_jobs": "status=active; aggregates operate on at most 10000 indexed recent active jobs, scoped to the company when specified",
      "period": "Rolling seven-day UTC interval; current statistics describe the current catalogue.",
      "remote_false": "Only on_site jobs; hybrid and unknown are excluded."
    },
    "limitations": [
      "Synthetic documentation example generated from a local test fixture; not live hiring data.",
      "Statistics cover the Exende monitored catalogue, not the global labour market.",
      "Missing fields and unclassified workplace types are not inferred.",
      "Last observed timestamps may be coalesced to one observation per UTC day; they are not fetch timestamps.",
      "Current skill associations are deterministic title/description extractions, not a complete or historical skill census.",
      "A job no longer observed does not prove a hire. Collection gaps and source coverage can affect observations."
    ],
    "freshness": {
      "last_observed_at": "2026-10-18T00:00:00.000Z",
      "oldest_last_observed_at": "2026-10-18T00:00:00.000Z"
    }
  }
}

GET · $0.05 USDC per request

Skills Intelligence

GET /v1/jobs/skills

Explore skills recorded in matching jobs, with observed counts, sample sizes, and freshness.

Parameters: role, location, company, period (7d).

Returns: Up to 10 skills, observed job counts, sample size, observation period, and data freshness. Uses current structured skill associations; it does not reconstruct historical skill demand.

bash

Unpaid probe · no funds spent

curl -i 'https://api.exende.dev/v1/jobs/skills?role=engineer&period=7d'
Synthetic JSON response example

Illustrative schema values, not live catalogue statistics.

json

Illustrative successful response

{
  "data": {
    "skills": [
      {
        "skill": "TypeScript",
        "observed_job_count": 1,
        "sample_size": 2
      }
    ],
    "sample_size": 2,
    "observation_period": {
      "start": "2026-10-12T12:00:00.000Z",
      "end": "2026-10-19T12:00:00.000Z",
      "days": 7
    },
    "basis": "Current active jobs and their current structured skills; period does not reconstruct historical skills"
  },
  "meta": {
    "product": "EXENDE JOBS INTELLIGENCE",
    "generated_at": "2026-10-19T12:00:00.000Z",
    "observation_period": {
      "start": "2026-10-12T12:00:00.000Z",
      "end": "2026-10-19T12:00:00.000Z",
      "days": 7
    },
    "coverage": {
      "scope": "Exende monitored catalogue",
      "aggregation": "complete matching current catalogue",
      "sampled": false,
      "candidate_limit": 10000,
      "candidate_jobs": 2,
      "candidate_scope": "monitored catalogue",
      "selection": "most recently observed active jobs",
      "pagination_available": false
    },
    "methodology": {
      "version": "deterministic-v1",
      "current_jobs": "status=active; aggregates operate on at most 10000 indexed recent active jobs, scoped to the company when specified",
      "period": "Rolling seven-day UTC interval; current statistics describe the current catalogue.",
      "remote_false": "Only on_site jobs; hybrid and unknown are excluded."
    },
    "limitations": [
      "Synthetic documentation example generated from a local test fixture; not live hiring data.",
      "Statistics cover the Exende monitored catalogue, not the global labour market.",
      "Missing fields and unclassified workplace types are not inferred.",
      "Last observed timestamps may be coalesced to one observation per UTC day; they are not fetch timestamps.",
      "Current skill associations are deterministic title/description extractions, not a complete or historical skill census.",
      "A job no longer observed does not prove a hire. Collection gaps and source coverage can affect observations."
    ],
    "freshness": {
      "last_observed_at": "2026-10-18T00:00:00.000Z",
      "oldest_last_observed_at": "2026-10-18T00:00:00.000Z"
    }
  }
}

GET · $0.25 USDC per request

Intelligence Report

GET /v1/jobs/report

Get a structured hiring report combining company activity, skills, history, methodology, and coverage.

Parameters: role, location, company, period (7d).

Returns: Report metadata, dataset coverage, job counts, hiring activity, company and skill statistics, available historical changes, timestamps, methodology, and limitations. Deterministic JSON; no AI-written commentary.

bash

Unpaid probe · no funds spent

curl -i 'https://api.exende.dev/v1/jobs/report?company=stripe.com&period=7d'
Synthetic JSON response example

Illustrative schema values, not live catalogue statistics.

json

Illustrative successful response

{
  "data": {
    "report": {
      "version": "1",
      "filters": {
        "period": "7d"
      },
      "dataset_coverage": {
        "scope": "Exende monitored catalogue",
        "aggregation": "complete matching current catalogue",
        "sampled": false,
        "candidate_limit": 10000,
        "candidate_jobs": 2,
        "candidate_scope": "monitored catalogue",
        "selection": "most recently observed active jobs",
        "pagination_available": false
      },
      "relevant_job_counts": {
        "active_jobs": 2,
        "observed_sample_jobs": 2,
        "companies_represented": 1,
        "companies_in_sample": 1,
        "engineering_jobs": 2,
        "engineering_jobs_in_sample": 2,
        "recently_observed_jobs": 1,
        "sample_size": 2
      },
      "hiring_activity": {
        "recently_observed_jobs": 1,
        "activity_score": 50,
        "score_formula": "round(100 * recently_observed_jobs / observed_sample_jobs, 2); zero when observed_sample_jobs=0"
      },
      "company_statistics": [
        {
          "name": "Example",
          "domain": "example.com",
          "active_jobs": 2,
          "last_observed_at": "2026-10-18T00:00:00.000Z",
          "observed_sample_jobs": 2
        }
      ],
      "skill_statistics": [
        {
          "skill": "TypeScript",
          "observed_job_count": 1,
          "sample_size": 2
        }
      ],
      "top_roles": [
        {
          "role": "Frontend Engineer",
          "observed_job_count": 1
        },
        {
          "role": "Software Engineer",
          "observed_job_count": 1
        }
      ],
      "historical_changes": {
        "status": "available",
        "newly_observed_jobs": 1,
        "no_longer_observed_jobs": 0,
        "net_observed_change": 1,
        "previous_observation": {
          "at": "2026-10-12T12:00:00.000Z",
          "active_jobs": 1
        },
        "latest_observation": {
          "at": "2026-10-19T12:00:00.000Z",
          "active_jobs": 2
        },
        "cohort_jobs": 2
      },
      "observation_timestamps": {
        "period_start": "2026-10-12T12:00:00.000Z",
        "period_end": "2026-10-19T12:00:00.000Z",
        "last_observed_at": "2026-10-18T00:00:00.000Z"
      },
      "methodology": {
        "version": "deterministic-v1",
        "current_jobs": "status=active; aggregates operate on at most 10000 indexed recent active jobs, scoped to the company when specified",
        "period": "Rolling seven-day UTC interval; current statistics describe the current catalogue.",
        "remote_false": "Only on_site jobs; hybrid and unknown are excluded."
      },
      "limitations": [
        "Statistics cover the Exende monitored catalogue, not the global labour market.",
        "Missing fields and unclassified workplace types are not inferred.",
        "Last observed timestamps may be coalesced to one observation per UTC day; they are not fetch timestamps.",
        "Current skill associations are deterministic title/description extractions, not a complete or historical skill census.",
        "A job no longer observed does not prove a hire. Collection gaps and source coverage can affect observations."
      ]
    }
  },
  "meta": {
    "product": "EXENDE JOBS INTELLIGENCE",
    "generated_at": "2026-10-19T12:00:00.000Z",
    "observation_period": {
      "start": "2026-10-12T12:00:00.000Z",
      "end": "2026-10-19T12:00:00.000Z",
      "days": 7
    },
    "coverage": {
      "scope": "Exende monitored catalogue",
      "aggregation": "complete matching current catalogue",
      "sampled": false,
      "candidate_limit": 10000,
      "candidate_jobs": 2,
      "candidate_scope": "monitored catalogue",
      "selection": "most recently observed active jobs",
      "pagination_available": false
    },
    "methodology": {
      "version": "deterministic-v1",
      "current_jobs": "status=active; aggregates operate on at most 10000 indexed recent active jobs, scoped to the company when specified",
      "period": "Rolling seven-day UTC interval; current statistics describe the current catalogue.",
      "remote_false": "Only on_site jobs; hybrid and unknown are excluded."
    },
    "limitations": [
      "Synthetic documentation example generated from a local test fixture; not live hiring data.",
      "Statistics cover the Exende monitored catalogue, not the global labour market.",
      "Missing fields and unclassified workplace types are not inferred.",
      "Last observed timestamps may be coalesced to one observation per UTC day; they are not fetch timestamps.",
      "Current skill associations are deterministic title/description extractions, not a complete or historical skill census.",
      "A job no longer observed does not prove a hire. Collection gaps and source coverage can affect observations."
    ],
    "freshness": {
      "last_observed_at": "2026-10-18T00:00:00.000Z",
      "oldest_last_observed_at": "2026-10-18T00:00:00.000Z"
    }
  }
}

Coverage, freshness & methodology

Every response includes data and meta with observation period, freshness, coverage, methodology, and limitations. Results represent Exende’s monitored catalogue, not the entire labour market. Generation time is calculation time; source observation timestamps can be older.

Current queries inspect up to 10,000 recent active jobs, scoped to a company first when supplied. Filters apply within that cohort. Check meta.coverage.sampled: incomplete cohorts expose sample counts and return null for unsupported full totals. Older matching jobs may be omitted.

The hiring activity score is round(100 × recently_observed_jobs / observed_sample_jobs, 2), or zero for an empty sample. Recent jobs are active matching jobs first observed within seven days. This measures observed activity, not company growth; adding a monitored source can affect it.

Historical comparisons require sufficient boundary observations and a complete cohort of at most 5,000 jobs. Company Changes returns HTTP 422 when this is unavailable. Trends and Report retain current statistics and label the history section unavailable. A disappearing job does not prove a hire. Skills use existing current structured associations and do not reconstruct historical skill demand.

All calculations use the existing Jobs data source and deterministic code. No endpoint performs AI inference.

Filters & response limits

  • Search: 1–10 jobs, default 10. Signals: 1–5 companies, default five. Other ranked lists are bounded to 10 items; report company statistics to five.
  • The only supported period is 7d. Company and Changes require a company domain; use a company present in the monitored catalogue. The stripe.com examples were verified on October 19, 2026.
  • Keyword: 2–120 characters. Role, location, and department: 2–80 characters. Text filters require one to eight words of at least two characters.
  • Company is an ASCII domain. Role matches title; location matches source text; department matches the recorded value without case sensitivity. Industry is unsupported.
  • remote=true selects remote jobs; remote=false selects known on-site jobs, excluding hybrid and unknown. Employment types: full_time, part_time, contract, temporary, internship, unknown.
  • Unknown or duplicate parameters, arbitrary SQL, pagination, and export requests are rejected.
  • Default admission limits: 30 requests/minute per IP, 10/minute per verified payer, 50/day per payer, and 500/day across the service. Admitted failures count toward daily limits. Distributed provider limits may be locally enforced.
  • Eight-second upstream budget and 128 KiB response ceiling. Public data responses use private/no-store; underlying calculations may be cached for five minutes. Cached calculations still require a new verified payment.

Error responses

Errors use { "error": { "code", "message", "request_id" } }. Inspect the error code and payment receipt; do not automatically pay again after an ambiguous response.

HTTPMeaning
400Invalid or unsupported parameters
402Missing or invalid payment, or unsuccessful settlement
404Unknown company or resource
405Unsupported method; GET required
409Payment authorization already used
422Insufficient historical observations
429Rate or daily admission limit reached
502 / 503Upstream failure or unavailable service configuration
504Upstream timeout

Machine-readable reference

The OpenAPI specification defines every parameter, nullable field, response schema, example, and payment header. Jobs Intelligence extends the existing Exende x402 service alongside Callback.