API reference

The /api/v1 API

One REST surface over the whole dataset: companies, jobs, tags, stats, and — with a token — the research and ingestion pipeline. The same hybrid search the site runs is available to every caller, and every response is JSON in one envelope.

Base URL: https://www.enterpriseaitrends.com/api/v1

Try it — no token needed
curl "https://www.enterpriseaitrends.com/api/v1/companies?search=anthropic"
Every response
{
  "data": …,          // object or array
  "meta": { … }       // pagination, on list endpoints
}
// or
{ "error": { "code": "NOT_FOUND", "message": "…" } }

Authentication

The bearer token is optional. Without one you get the anonymous tier: the same catalog the website renders publicly, in small pages. A token lifts every ceiling and unlocks the endpoints that expose work the site doesn't publish — deep research, discovery, enrichment, onboarding, and all writes.

AnonymousWith token
EndpointsGET catalog readsEverything
Rate limit20/min per IP100/min per token
Max page size20100 (50 on /jobs)
Result windowFirst 100 rowsFirst 1,000 rows
Authenticated request
curl -H "Authorization: Bearer $TOKEN" \
  "https://www.enterpriseaitrends.com/api/v1/stats"

A presented-but-invalid token is rejected, never silently downgraded to anonymous — a revoked or typo'd credential fails where it is used.

Rate limits

20 requests/minute per IP anonymously; 100/minute per token. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-Api-Tier; a 429 includes Retry-After in seconds.

429 response
HTTP/1.1 429 Too Many Requests
Retry-After: 31

{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Too many requests. Limit: 20/min for anonymous callers."
  }
}

Pagination

List endpoints take page and limit and return a meta block. Three ceilings bound how much of the dataset one caller can walk: the per-tier page size, the result window (a request whose offset reaches past it returns 400 RESULT_WINDOW_EXCEEDED — narrow with filters instead of paging deeper), and search results, which are a ranked shortlist capped at 100 for both tiers, where meta.total describes the shortlist.

Errors

Errors share one shape: { "error": { "code", "message" } }.

400BAD_REQUEST / RESULT_WINDOW_EXCEEDEDMalformed input, or paging past the tier's result window.
401UNAUTHORIZEDAnonymous request to an endpoint that needs a token.
403FORBIDDENToken presented but not valid — never silently downgraded.
404NOT_FOUNDNo such resource.
429RATE_LIMITEDRate limit exceeded; respect Retry-After.
500SERVER_ERRORSomething broke on our side.

Catalog

GET/api/v1/jobs

List jobs

Active jobs with optional filters. Search runs the same hybrid keyword + semantic engine the site uses, so a search response is a ranked shortlist (capped at 100) rather than an exhaustive listing.

Query parameters

role_categorystring

Client-facing: fde, solutions_engineer, csm, tam, sales_engineer, implementation, professional_services. Broad: engineering, product, design, marketing, data, operations, sales, finance, hr, legal, other.

client_facingboolean

true returns every client-facing category.

companystring

Filter by company slug.

locationstring

Partial match on location.

remote_onlyboolean

true returns only remote jobs.

searchstring

Hybrid search over job title and company.

pageinteger

Page number. Default 1.

limitinteger

Results per page. Default 20; max 50 with a token, 20 anonymous.

Request
curl -H "Authorization: Bearer $TOKEN" \
  "https://www.enterpriseaitrends.com/api/v1/jobs?role_category=fde&limit=5"
Response
{
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "title": "Forward Deployed Engineer",
      "company": { "name": "Anthropic", "slug": "anthropic" },
      "location": "San Francisco, CA",
      "remote": false,
      "roleCategory": "fde",
      "url": "https://...",
      "postedAt": "2026-08-01T00:00:00.000Z"
    }
  ],
  "meta": { "page": 1, "limit": 5, "total": 132, "totalPages": 27 }
}
GET/api/v1/jobs/:id

Get a job

A single job by UUID, including the full description.

Path parameters

iduuidrequired

The job's ID.

Request
curl -H "Authorization: Bearer $TOKEN" \
  "https://www.enterpriseaitrends.com/api/v1/jobs/550e8400-e29b-41d4-a716-446655440000"
Response
{
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "title": "Forward Deployed Engineer",
    "description": "…full text…",
    "company": { "name": "Anthropic", "slug": "anthropic" }
  }
}
GET/api/v1/companies

List companies

Active companies with their tags. search runs the hybrid engine; tag filters accept comma-separated slugs per dimension and AND across dimensions.

Query parameters

searchstring

Hybrid search over name, description and research.

industrystring

Comma-separated tag slugs, e.g. developer-tools,fintech.

stagestring

Comma-separated stage slugs.

ai_rolestring

Comma-separated ai_role slugs.

business_modelstring

Comma-separated business_model slugs.

funding_tierstring

Comma-separated funding_tier slugs.

pageinteger

Page number. Default 1.

limitinteger

Results per page. Default 50; max 100 with a token, 20 anonymous.

Request
curl "https://www.enterpriseaitrends.com/api/v1/companies?search=anthropic"
Response
{
  "data": [
    {
      "id": "…",
      "name": "Anthropic",
      "slug": "anthropic",
      "domain": "anthropic.com",
      "oneLiner": "AI safety and research company…",
      "tags": [
        { "dimension": "industry", "value": "Foundation Models", "slug": "foundation-models" }
      ]
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 1, "totalPages": 1 }
}
GET/api/v1/companies/:id

Get a company

A single company by UUID or slug, including tags and its active-job count.

Path parameters

iduuid | slugrequired

Company UUID or slug.

Request
curl "https://www.enterpriseaitrends.com/api/v1/companies/anthropic"
Response
{
  "data": {
    "id": "…",
    "name": "Anthropic",
    "slug": "anthropic",
    "activeJobCount": 132,
    "tags": [ … ]
  }
}
GET/api/v1/tags

List tags

Every tag, grouped by dimension: industry, stage, business_model, ai_role, funding_tier. Use the slugs in /companies filters.

Request
curl "https://www.enterpriseaitrends.com/api/v1/tags"
Response
{
  "data": {
    "industry": [ { "value": "Developer Tools", "slug": "developer-tools" }, … ],
    "stage": [ … ],
    "ai_role": [ … ],
    "business_model": [ … ],
    "funding_tier": [ … ]
  }
}
GET/api/v1/stats

Get stats

Site-wide totals.

Request
curl "https://www.enterpriseaitrends.com/api/v1/stats"
Response
{
  "data": {
    "totalJobs": 27474,
    "totalCompanies": 3295,
    "newToday": 524
  }
}

Pipeline & research

POST/api/v1/onboard token

Onboard a company

Create or update a company and run ingestion (enrichment, job-board discovery, first scrape) as a durable workflow on the pipeline worker. Returns 202 immediately; concurrent onboards of the same domain collapse into one run.

Body parameters

namestringrequired

Company name.

domainstringrequired

Company domain, e.g. acme.com. URLs are normalized.

forceboolean

Re-run steps whose completion markers are already set. Default false.

Request
curl -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Acme AI", "domain": "acme.com"}' \
  "https://www.enterpriseaitrends.com/api/v1/onboard"
Response
{
  "data": {
    "workflowId": "d5cbb4b2-…",
    "domain": "acme.com",
    "status": "enqueued"
  }
}

202 Accepted — track the run in the pipelines admin.

POST/api/v1/enrich token

Re-enrich a company

Re-acquire facts for an existing company (force ingest), then re-derive tags and its embedding. Returns 202 with the workflow ID.

Body parameters

domainstringrequired

Domain of a tracked company.

Request
curl -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domain": "acme.com"}' \
  "https://www.enterpriseaitrends.com/api/v1/enrich"
Response
{
  "data": {
    "workflowId": "…",
    "company": { "id": "…", "name": "Acme AI", "domain": "acme.com" },
    "status": "enqueued"
  }
}

404 if the domain isn't tracked yet — use /onboard for new companies.

POST/api/v1/promote_and_onboard token

Run the discovery pipeline

Trigger discovery processing now: intake unprocessed sightings into candidates, validate them, and hand qualified domains to ingestion. Concurrent triggers collapse into one run.

Body parameters

limitinteger

Max sightings to intake (≤ 1000).

maxValidationsinteger

Max candidate validations this run (≤ 100). maxOnboards is accepted as a legacy alias.

Request
curl -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"limit": 200, "maxValidations": 20}' \
  "https://www.enterpriseaitrends.com/api/v1/promote_and_onboard"
Response
{
  "data": {
    "workflowId": "…",
    "args": { "limit": 200, "maxValidations": 20 },
    "status": "enqueued"
  }
}

202 Accepted. Body is optional — omit it to run with defaults.

POST/api/v1/discover token

Submit discoveries

Append company sightings to the discovery log — the front door every finder (research sessions, generators, extensions) converges on. Idempotent per (source, key); partial success is a 200 with per-item rejections.

Body parameters

itemsarrayrequired

Items of { source, key, payload? }. A single bare item or a bare array also works; max 200 per request.

labelstring

Optional label for the batch (≤ 200 chars).

Request
curl -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"label": "manual research", "items": [
        {"source": "funding", "key": {"domain": "acme.com"},
         "payload": {"round": "Series A"}}
      ]}' \
  "https://www.enterpriseaitrends.com/api/v1/discover"
Response
{
  "data": {
    "label": "manual research",
    "received": 1,
    "inserted": 1,
    "duplicates": 0,
    "invalid": 0,
    "rejectedItems": [],
    "invalidKeys": []
  }
}
POST/api/v1/deep-research token

Run deep research

Run the research pipeline for a tracked company and store the dossier (synchronous — expect 30–120s). The dossier feeds the company page and the company's search embedding.

Body parameters

domainstringrequired

Domain of a tracked company.

modestring

"full" (default) or "fast".

processorstring

Research depth/cost: "lite", "base" (default), "core", "core2x", "pro", "ultra".

Request
curl -X POST -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domain": "acme.com", "mode": "full", "processor": "base"}' \
  "https://www.enterpriseaitrends.com/api/v1/deep-research"
Response
{
  "data": {
    "company": { "id": "…", "name": "Acme AI", "domain": "acme.com", "slug": "acme-ai" },
    "mode": "full",
    "processor": "base",
    "research": { "summary": "…", "founders": [ … ], … }
  }
}
GET/api/v1/deep-research/:domain token

Get a research dossier

The stored dossier for a company: summary, founders, leadership, market analysis, funding rounds, competitors, and the full markdown report.

Path parameters

domainstringrequired

Domain of a tracked company.

Request
curl -H "Authorization: Bearer $TOKEN" \
  "https://www.enterpriseaitrends.com/api/v1/deep-research/acme.com"
Response
{
  "data": {
    "company": { "id": "…", "name": "Acme AI", "domain": "acme.com", "slug": "acme-ai" },
    "research": {
      "summary": "…",
      "foundedYear": 2023,
      "employeeCount": 40,
      "fundingRounds": [ … ],
      "markdownReport": "…"
    }
  }
}

404 if the company has no stored research yet — run POST /deep-research first.

Questions or a token request — reach out. The reference source of truth lives in the repo as API.md.