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
curl "https://www.enterpriseaitrends.com/api/v1/companies?search=anthropic"{
"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.
| Anonymous | With token | |
|---|---|---|
| Endpoints | GET catalog reads | Everything |
| Rate limit | 20/min per IP | 100/min per token |
| Max page size | 20 | 100 (50 on /jobs) |
| Result window | First 100 rows | First 1,000 rows |
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.
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" } }.
BAD_REQUEST / RESULT_WINDOW_EXCEEDEDMalformed input, or paging past the tier's result window.UNAUTHORIZEDAnonymous request to an endpoint that needs a token.FORBIDDENToken presented but not valid — never silently downgraded.NOT_FOUNDNo such resource.RATE_LIMITEDRate limit exceeded; respect Retry-After.SERVER_ERRORSomething broke on our side.Catalog
/api/v1/jobsList 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_categorystringClient-facing: fde, solutions_engineer, csm, tam, sales_engineer, implementation, professional_services. Broad: engineering, product, design, marketing, data, operations, sales, finance, hr, legal, other.
client_facingbooleantrue returns every client-facing category.
companystringFilter by company slug.
locationstringPartial match on location.
remote_onlybooleantrue returns only remote jobs.
searchstringHybrid search over job title and company.
pageintegerPage number. Default 1.
limitintegerResults per page. Default 20; max 50 with a token, 20 anonymous.
curl -H "Authorization: Bearer $TOKEN" \
"https://www.enterpriseaitrends.com/api/v1/jobs?role_category=fde&limit=5"{
"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 }
}/api/v1/jobs/:idGet a job
A single job by UUID, including the full description.
Path parameters
iduuidrequiredThe job's ID.
curl -H "Authorization: Bearer $TOKEN" \
"https://www.enterpriseaitrends.com/api/v1/jobs/550e8400-e29b-41d4-a716-446655440000"{
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Forward Deployed Engineer",
"description": "…full text…",
"company": { "name": "Anthropic", "slug": "anthropic" }
}
}/api/v1/companiesList 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
searchstringHybrid search over name, description and research.
industrystringComma-separated tag slugs, e.g. developer-tools,fintech.
stagestringComma-separated stage slugs.
ai_rolestringComma-separated ai_role slugs.
business_modelstringComma-separated business_model slugs.
funding_tierstringComma-separated funding_tier slugs.
pageintegerPage number. Default 1.
limitintegerResults per page. Default 50; max 100 with a token, 20 anonymous.
curl "https://www.enterpriseaitrends.com/api/v1/companies?search=anthropic"{
"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 }
}/api/v1/companies/:idGet a company
A single company by UUID or slug, including tags and its active-job count.
Path parameters
iduuid | slugrequiredCompany UUID or slug.
curl "https://www.enterpriseaitrends.com/api/v1/companies/anthropic"{
"data": {
"id": "…",
"name": "Anthropic",
"slug": "anthropic",
"activeJobCount": 132,
"tags": [ … ]
}
}/api/v1/statsGet stats
Site-wide totals.
curl "https://www.enterpriseaitrends.com/api/v1/stats"{
"data": {
"totalJobs": 27474,
"totalCompanies": 3295,
"newToday": 524
}
}Pipeline & research
/api/v1/onboard tokenOnboard 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
namestringrequiredCompany name.
domainstringrequiredCompany domain, e.g. acme.com. URLs are normalized.
forcebooleanRe-run steps whose completion markers are already set. Default false.
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"{
"data": {
"workflowId": "d5cbb4b2-…",
"domain": "acme.com",
"status": "enqueued"
}
}202 Accepted — track the run in the pipelines admin.
/api/v1/enrich tokenRe-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
domainstringrequiredDomain of a tracked company.
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"domain": "acme.com"}' \
"https://www.enterpriseaitrends.com/api/v1/enrich"{
"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.
/api/v1/promote_and_onboard tokenRun 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
limitintegerMax sightings to intake (≤ 1000).
maxValidationsintegerMax candidate validations this run (≤ 100). maxOnboards is accepted as a legacy alias.
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"{
"data": {
"workflowId": "…",
"args": { "limit": 200, "maxValidations": 20 },
"status": "enqueued"
}
}202 Accepted. Body is optional — omit it to run with defaults.
/api/v1/discover tokenSubmit 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
itemsarrayrequiredItems of { source, key, payload? }. A single bare item or a bare array also works; max 200 per request.
labelstringOptional label for the batch (≤ 200 chars).
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"{
"data": {
"label": "manual research",
"received": 1,
"inserted": 1,
"duplicates": 0,
"invalid": 0,
"rejectedItems": [],
"invalidKeys": []
}
}/api/v1/deep-research tokenRun 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
domainstringrequiredDomain of a tracked company.
modestring"full" (default) or "fast".
processorstringResearch depth/cost: "lite", "base" (default), "core", "core2x", "pro", "ultra".
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"{
"data": {
"company": { "id": "…", "name": "Acme AI", "domain": "acme.com", "slug": "acme-ai" },
"mode": "full",
"processor": "base",
"research": { "summary": "…", "founders": [ … ], … }
}
}/api/v1/deep-research/:domain tokenGet a research dossier
The stored dossier for a company: summary, founders, leadership, market analysis, funding rounds, competitors, and the full markdown report.
Path parameters
domainstringrequiredDomain of a tracked company.
curl -H "Authorization: Bearer $TOKEN" \
"https://www.enterpriseaitrends.com/api/v1/deep-research/acme.com"{
"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.