Skip to documentation
Developer documentation REST API · v1

Your first API request

Bring company intelligence into your own tools. Read company profiles, find jobs, and retrieve research with a single API key.

Base URLhttps://www.enterpriseaitrends.com/api/v1
1

Create an API key

Sign in to your account, then create or select an organization. Under API keys, choose a personal key, give it a name, and select an expiry. Copy the key when it appears; it is only shown once.

Get your API key
2

Make a request

Set FDE_API_KEY in your terminal or secret manager, then check the identity associated with your key.

Terminal
export FDE_API_KEY="YOUR_API_KEY"

curl --fail-with-body \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/v1/me"

A successful request returns HTTP 200 and a JSON body. For a personal key:

200 · JSON
{
  "data": {
    "type": "user",
    "userId": "user_example",
    "email": null,
    "name": null,
    "organizationId": "org_example"
  }
}
3

Explore the catalog

Fetch a page of companies. Use an id, slug, or domain from the response to look up a company, find its jobs, or retrieve its research.

List companies · cURL
curl --fail-with-body \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/v1/companies?limit=5"

Get started

Authentication

Every endpoint in this reference requires an API key. Send it in one of these headers on each request:

Request headers · choose one
X-Api-Key: YOUR_API_KEY

Authorization: Bearer YOUR_API_KEY

Keep the key on your server or in a secret manager. Do not put it in a query string, commit it to source control, or embed it in a public website.

Key types
FieldDescription
Personal keypk_live_…Bound to your user and one organization. You must remain a member of that organization for the key to work.
Organization keysk_live_…Bound to an organization. Organization owners and admins can create these keys for shared integrations.

Both key types can read the catalog endpoints below. List management requires a personal key. Set an expiry of 7, 30, 90, or 365 days when creating a key (default: 90 days). Revoke a key from your account when you no longer need it. Expired or revoked keys return 401.

Get started

Pagination & filtering

Company and job lists return a data array and a meta object. Single-record endpoints return an object under data. JSON field names use camelCase; query parameters use the names listed in each endpoint.

Empty list · JSON
{
  "data": [],
  "meta": {
    "page": 1,
    "limit": 20,
    "total": 0,
    "totalPages": 0
  }
}
Pagination metadata
FieldDescription
page / limitnumberThe page number and effective page size after defaults and clamping are applied.
total / totalPagesnumberMatching record count and page count. The result-window limit still applies even if totalPages is larger.

Pages start at 1. Companies default to 50 items per page (maximum 100); jobs default to 20 (maximum 50). Missing, nonnumeric, zero, or negative pagination values fall back to the defaults.

A page cannot start at or beyond result 1001. Deeper requests return 400 RESULT_WINDOW_EXCEEDED. Search queries return at most 100 matches. Narrow your filters instead of continuing beyond these limits.

Use --data-urlencode with cURL to safely encode filter values. For example, find remote engineering roles:

Filtered jobs · cURL
curl --fail-with-body --get \
  -H "X-Api-Key: $FDE_API_KEY" \
  --data-urlencode "role_category=engineering" \
  --data-urlencode "remote_only=true" \
  --data-urlencode "limit=10" \
  "https://www.enterpriseaitrends.com/api/v1/jobs"

Get started

Rate limits

The API allows 100 requests per minute. Personal keys share a request budget per user; organization keys have a budget per key. When that budget is exhausted, requests return 429 RATE_LIMITED.

Rate-limit response headers
FieldDescription
X-RateLimit-LimitintegerRequest budget for the current window: 100.
X-RateLimit-RemainingintegerRequests remaining in the current window.
Retry-Afterinteger · on 429Seconds to wait before retrying. Pause requests for this duration.
X-Api-Tierstringtoken for authenticated API requests.

Cache responses where practical and avoid tight retry loops. Key verification also has a shared limit of 600 checks per minute per key across services; exceeding it can return 401. If a valid key starts failing during a burst of requests, pause for a minute before trying again.

Get started

Errors

Check the HTTP status before reading data. API errors use an error object with a stable code and a human-readable message.

401 · JSON
{
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Invalid, expired or revoked API key"
  }
}
Common errors
FieldDescription
401 · UNAUTHORIZEDAuthenticationMissing, malformed, invalid, expired, or revoked key; a personal key also fails if its owner leaves the organization. Check your header and key in your account.
400 · RESULT_WINDOW_EXCEEDEDPaginationThe requested page starts beyond the allowed result window. Narrow the query or request an earlier page.
404 · NOT_FOUNDMissing resourceThe requested record or stored research report was not found. Check the identifier; not every company has research.
429 · RATE_LIMITEDRate limitWait for the number of seconds in Retry-After before sending another request.
500 · INTERNALServer errorThe API could not complete the request. Retry after a delay. If it persists, check the identifier and retain the status and response for troubleshooting.

API reference

Read the catalog

Catalog endpoints use GET and return JSON. Company list management follows the catalog reference. Examples use fictional records and counts; retrieve live identifiers from the list endpoints. Profile and research fields may be null when information is unavailable.

GET/me

Check your identity

Check which organization your key belongs to. This is a useful first request when setting up an integration or troubleshooting a key.

Check your identity · cURL
curl --fail-with-body \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/v1/me"
Response fields · inside data
FieldDescription
typestringuser for a personal key; organization for an organization key.
organizationIdstring | nullOrganization the key is bound to.
userIdstring · personal keysThe personal key’s owner.
email / namestring | null · personal keysProfile information may be null on key-only requests. If profile lookup fails, only type and userId are returned.
Example response 200 · application/json
Check your identity · JSON
{
  "data": {
    "type": "user",
    "userId": "user_example",
    "email": null,
    "name": null,
    "organizationId": "org_example"
  }
}
An organization key returns { "data": { "type": "organization", "organizationId": "org_example" } }.
GET/companies

List companies

Browse active, visible companies or find companies by search and classification tags. Without a search term, results are ordered by active job count, profile completeness, then name.

Query parameters
FieldDescription
pageintegerPage number, starting at 1. Default: 1.
limitintegerItems per page. Default: 50; maximum: 100. Larger values are clamped.
searchstringSearch by name or a description of what the company does. Search returns up to 100 ranked matches.
organization_typestringComma-separated tag slugs from GET /tags. Matches any supplied slug within this dimension; separate dimensions must all match.
ecosystemstringComma-separated tag slugs from GET /tags. Matches any supplied slug within this dimension; separate dimensions must all match.
activitystringComma-separated tag slugs from GET /tags. Matches any supplied slug within this dimension; separate dimensions must all match.
specializationstringComma-separated tag slugs from GET /tags. Matches any supplied slug within this dimension; separate dimensions must all match.
marketstringComma-separated tag slugs from GET /tags. Matches any supplied slug within this dimension; separate dimensions must all match.
customer_segmentstringComma-separated tag slugs from GET /tags. Matches any supplied slug within this dimension; separate dimensions must all match.
delivery_modelstringComma-separated tag slugs from GET /tags. Matches any supplied slug within this dimension; separate dimensions must all match.
revenue_modelstringComma-separated tag slugs from GET /tags. Matches any supplied slug within this dimension; separate dimensions must all match.
listing_statusstringComma-separated tag slugs from GET /tags. Matches any supplied slug within this dimension; separate dimensions must all match.
funding_stagestringComma-separated tag slugs from GET /tags. Matches any supplied slug within this dimension; separate dimensions must all match.
funding_tierstringComma-separated tag slugs from GET /tags. Matches any supplied slug within this dimension; separate dimensions must all match.
List companies · cURL
curl --fail-with-body \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/v1/companies?limit=1"
Response fields · inside data
FieldDescription
parentCompanyId / entityScopestring | nullReviewed subdivision identity; a shared host does not imply the same organization.
classificationAssessmentsobject | nullPer-dimension known, unknown or not_applicable status with an evidence-based reason. Null before ontology assessment.
idstringCompany UUID. Use this or the slug to retrieve the company.
name / slugstringDisplay name and URL slug.
domain / website / logoUrlstring | nullCompany domain, website URL, and logo URL.
description / headcountRange / hqLocationstring | nullCompany profile and headquarters. Missing profile facts are null.
totalFunding / latestValuation / annualRevenuestring | nullDisplay text, not numeric currency values. Do not assume these can be parsed as numbers.
sourceKind / sourcePlatform / sourceUrlstring | nullPreferred active job source: its kind, platform, and URL. Null when no source is available.
activeJobCountnumberNumber of active jobs at this company.
tagsarray<object>Classification tags, each with dimension, value (display label), and slug (filter value). May be empty.
matchType / matchStrength / matchedTermsoptionalRanked search results may add matchType (keyword, semantic, or both), matchStrength (strong, good, or weak), and matchedTerms (string array). These fields are absent from ordinary listings and may be absent on search fallback results.
Example response 200 · application/json
List companies · JSON
{
  "data": [
    {
      "id": "3c123740-3ef5-4d1e-b701-08a8f2d30a12",
      "name": "Example AI",
      "slug": "example-ai",
      "domain": "example.com",
      "website": "https://example.com",
      "logoUrl": null,
      "headcountRange": "11-50",
      "description": "Tools for building AI applications.",
      "hqLocation": "New York, NY",
      "totalFunding": null,
      "latestValuation": null,
      "annualRevenue": null,
      "sourceKind": null,
      "sourcePlatform": null,
      "sourceUrl": null,
      "activeJobCount": 1,
      "tags": []
    }
  ],
  "meta": {
    "page": 1,
    "limit": 1,
    "total": 1,
    "totalPages": 1
  }
}
GET/companies/{id}

Get a company

Retrieve a company’s profile, classification tags, and job count. Use an id or slug returned by the company list.

Path parameters
FieldDescription
idstring · requiredCompany UUID or slug.

Set COMPANY_ID to a value from the corresponding list response before running this request.

Get a company · cURL
curl --fail-with-body \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/v1/companies/$COMPANY_ID"
Response fields · inside data
FieldDescription
parentCompanyId / entityScopestring | nullReviewed subdivision identity; a shared host does not imply the same organization.
classificationAssessmentsobject | nullPer-dimension known, unknown or not_applicable status with an evidence-based reason. Null before ontology assessment.
idstringCompany UUID. Use this or the slug to retrieve the company.
name / slugstringDisplay name and URL slug.
domain / website / logoUrlstring | nullCompany domain, website URL, and logo URL.
description / headcountRange / hqLocationstring | nullCompany profile and headquarters. Missing profile facts are null.
totalFunding / latestValuation / annualRevenuestring | nullDisplay text, not numeric currency values. Do not assume these can be parsed as numbers.
sourceKind / sourcePlatform / sourceUrlstring | nullPreferred active job source: its kind, platform, and URL. Null when no source is available.
activeJobCountnumberNumber of active jobs at this company.
tagsarray<object>Classification tags, each with dimension, value (display label), and slug (filter value). May be empty.
oneLiner / keyInvestors / linkedinUrl / careersUrlstring | nullShort description, investor information, LinkedIn URL, and careers URL.
enrichmentUpdatedAt / lastRunAtstring | nullISO 8601 timestamps for the last profile enrichment and job-source run, respectively.
Example response 200 · application/json
Get a company · JSON
{
  "data": {
    "id": "3c123740-3ef5-4d1e-b701-08a8f2d30a12",
    "name": "Example AI",
    "slug": "example-ai",
    "domain": "example.com",
    "website": "https://example.com",
    "logoUrl": null,
    "headcountRange": "11-50",
    "description": "Tools for building AI applications.",
    "hqLocation": "New York, NY",
    "totalFunding": null,
    "latestValuation": null,
    "annualRevenue": null,
    "sourceKind": null,
    "sourcePlatform": null,
    "sourceUrl": null,
    "activeJobCount": 1,
    "tags": [],
    "oneLiner": "Tools for AI developers.",
    "keyInvestors": null,
    "linkedinUrl": null,
    "careersUrl": "https://example.com/careers",
    "enrichmentUpdatedAt": null,
    "lastRunAt": null
  }
}
Returns 404 NOT_FOUND if the company does not exist or is not active and visible.
GET/jobs

List jobs

Find active jobs at visible companies. Without a search term, the most recently observed new jobs come first. Combine filters to narrow the results.

Query parameters
FieldDescription
pageintegerPage number, starting at 1. Default: 1.
limitintegerItems per page. Default: 20; maximum: 50. Larger values are clamped.
searchstringSearch for a role or describe the work you want to find. Search returns up to 100 ranked matches.
companystringExact company slug, such as the slug returned by GET /companies. Not a UUID or domain.
role_categorystringExact category: fde, solutions_engineer, csm, tam, sales_engineer, implementation, professional_services, sales, engineering, product, design, marketing, data, operations, finance, hr, legal, or other.
client_facingbooleanSet to true for fde, solutions_engineer, csm, tam, sales_engineer, implementation, professional_services, and sales. Ignored when role_category is supplied.
locationstringCase-insensitive match within the location text.
remote_onlybooleanSet to true to include only jobs whose remotePolicy is remote. Hybrid jobs are excluded. Boolean filters only enable on the literal value true.
List jobs · cURL
curl --fail-with-body \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/v1/jobs?limit=1"
Response fields · inside data
FieldDescription
id / titlestringJob UUID and job title.
roleCategory / departmentstring | nullRole classification and department.
location / remotePolicystring | nullLocation text and remote policy. The remote_only filter matches remote exactly.
salaryMin / salaryMaxnumber | nullPublished salary range when available.
salaryCurrencystring | nullCurrency associated with the salary range.
applyUrlstringURL of the application page.
firstSeenAt / lastSeenAtstringISO 8601 timestamps for when the job was first and last observed; not publication dates.
companyName / companySlugstringEmployer name and slug. Use companySlug in the company filter.
companyLogoUrlstring | nullEmployer logo.
companyDomain / companyDescription / companyHqLocation / companyTotalFundingstring | nullEmployer profile details. Funding is display text, not a number.
matchType / matchStrength / matchedTermsoptionalRanked search results may add matchType (keyword, semantic, or both), matchStrength (strong, good, or weak), and matchedTerms (string array). These fields are absent from ordinary listings and may be absent on search fallback results.
Example response 200 · application/json
List jobs · JSON
{
  "data": [
    {
      "id": "b17ff1e4-90fc-4a15-b659-521d0773a2b1",
      "title": "Software Engineer",
      "roleCategory": "engineering",
      "department": "Engineering",
      "location": "New York, NY",
      "remotePolicy": "hybrid",
      "salaryMin": null,
      "salaryMax": null,
      "salaryCurrency": "USD",
      "applyUrl": "https://example.com/careers/engineer",
      "firstSeenAt": "2026-09-01T12:00:00.000Z",
      "lastSeenAt": "2026-09-08T12:00:00.000Z",
      "companyName": "Example AI",
      "companySlug": "example-ai",
      "companyLogoUrl": null,
      "companyDomain": "example.com",
      "companyDescription": "Tools for building AI applications.",
      "companyHqLocation": "New York, NY",
      "companyTotalFunding": null
    }
  ],
  "meta": {
    "page": 1,
    "limit": 1,
    "total": 1,
    "totalPages": 1
  }
}
GET/jobs/{id}

Get a job

Retrieve a job’s description and application URL. Check status before displaying the listing: a saved job can still be returned after it is no longer active.

Path parameters
FieldDescription
idstring · requiredJob UUID returned by GET /jobs.

Set JOB_ID to a value from the corresponding list response before running this request.

Get a job · cURL
curl --fail-with-body \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/v1/jobs/$JOB_ID"
Response fields · inside data
FieldDescription
id / titlestringJob UUID and job title.
roleCategory / departmentstring | nullRole classification and department.
location / remotePolicystring | nullLocation text and remote policy. The remote_only filter matches remote exactly.
salaryMin / salaryMaxnumber | nullPublished salary range when available.
salaryCurrencystring | nullCurrency associated with the salary range.
applyUrlstringURL of the application page.
firstSeenAt / lastSeenAtstringISO 8601 timestamps for when the job was first and last observed; not publication dates.
companyName / companySlugstringEmployer name and slug. Use companySlug in the company filter.
companyLogoUrlstring | nullEmployer logo.
descriptionstring | nullFull job description; may contain HTML. Sanitize before rendering as HTML.
statusstringCurrent job status, such as active.
companyWebsitestring | nullEmployer website. This detail response does not include the list-only companyDomain, companyDescription, companyHqLocation, or companyTotalFunding fields.
Example response 200 · application/json
Get a job · JSON
{
  "data": {
    "id": "b17ff1e4-90fc-4a15-b659-521d0773a2b1",
    "title": "Software Engineer",
    "roleCategory": "engineering",
    "department": "Engineering",
    "location": "New York, NY",
    "remotePolicy": "hybrid",
    "salaryMin": null,
    "salaryMax": null,
    "salaryCurrency": "USD",
    "applyUrl": "https://example.com/careers/engineer",
    "firstSeenAt": "2026-09-01T12:00:00.000Z",
    "lastSeenAt": "2026-09-08T12:00:00.000Z",
    "description": "Build tools for AI developers.",
    "status": "active",
    "companyName": "Example AI",
    "companySlug": "example-ai",
    "companyLogoUrl": null,
    "companyWebsite": "https://example.com"
  }
}
Returns 404 NOT_FOUND if no job matches the UUID. Use a UUID returned by the list endpoint; malformed identifiers are not a supported lookup.
GET/tags

List classification tags

Get the available classification labels, grouped by dimension. Use the slug rather than the display value when filtering companies. No parameters are required.

List classification tags · cURL
curl --fail-with-body \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/v1/tags"
Response fields
FieldDescription
dataobjectA map of dimension names to arrays of { value, slug }. Labels are sorted by dimension and value; empty dimensions are omitted.
value / slugstringHuman-readable label and the corresponding filter value.
Example response 200 · application/json
List classification tags · JSON
{
  "data": {
    "market": [
      {
        "value": "Healthcare",
        "slug": "healthcare"
      }
    ],
    "funding_stage": [
      {
        "value": "Series A",
        "slug": "series-a"
      }
    ]
  }
}
Company filters use the shared ontology dimensions returned by the tags endpoint. This example shows a subset of possible dimensions; fetch the endpoint for current values.
GET/stats

Get catalog statistics

Get a snapshot of the catalog’s job and company counts. No parameters are required.

Get catalog statistics · cURL
curl --fail-with-body \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/v1/stats"
Response fields · inside data
FieldDescription
totalJobsnumberActive jobs at visible companies.
totalCompaniesnumberActive, visible companies.
newTodaynumberJobs first observed in the last 24 hours at visible companies, including jobs that have since become inactive. This is a rolling window, not a calendar day.
Example response 200 · application/json
Get catalog statistics · JSON
{
  "data": {
    "totalJobs": 1250,
    "totalCompanies": 240,
    "newToday": 32
  }
}
GET/deep-research/{domain}

Get company research

Read a company’s existing research report, including its market, products, people, and funding. Coverage varies by company; this request does not generate a new report.

Path parameters
FieldDescription
domainstring · requiredExact company domain returned by GET /companies, without a scheme or path.

Set COMPANY_DOMAIN to a value from the corresponding list response before running this request.

Get company research · cURL
curl --fail-with-body \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/v1/deep-research/$COMPANY_DOMAIN"
Response fields · inside data
FieldDescription
companyobjectCompany identity: id, name, domain, and slug.
research.summary / oneLinerstring | nullCompany overview and short description. All remaining fields below are inside research.
foundedYear / employeeCountnumber | nullFounding year and reported employee count.
hqCity / hqState / hqCountrystring | nullHeadquarters details.
businessModel / marketAnalysis / targetCustomersstring | nullBusiness model, market context, and customer profile.
founders / leadershiparray<object> | nullPeople with name and title.
keyProducts / competitors / techStack / notableCustomersarray<string> | nullReported products, competitors, technologies, and customers.
fundingRoundsarray<object> | nullEntries with date, amount, round, and investors (string array). Dates and amounts are report text.
recentNewsarray<object> | nullEntries with title, date, and summary; url, id, category, and citations (objects with url and authority) may also be present.
markdownReport / screenshotUrl / processorTierstring | nullFull report in Markdown, an optional screenshot URL, and the stored research tier.
lastFullResearchAt / lastFastResearchAt / enrichedAtstring | nullISO 8601 research timestamps. Use these to assess freshness.
Example response 200 · application/json
Get company research · JSON
{
  "data": {
    "company": {
      "id": "3c123740-3ef5-4d1e-b701-08a8f2d30a12",
      "name": "Example AI",
      "domain": "example.com",
      "slug": "example-ai"
    },
    "research": {
      "summary": "Tools for building AI applications.",
      "oneLiner": null,
      "foundedYear": null,
      "hqCity": null,
      "hqState": null,
      "hqCountry": null,
      "employeeCount": null,
      "businessModel": null,
      "founders": null,
      "leadership": null,
      "marketAnalysis": null,
      "targetCustomers": null,
      "keyProducts": null,
      "recentNews": null,
      "competitors": null,
      "techStack": null,
      "fundingRounds": null,
      "notableCustomers": null,
      "markdownReport": "# Example AI\n\nTools for building AI applications.",
      "screenshotUrl": null,
      "processorTier": "base",
      "lastFullResearchAt": "2026-09-01T12:00:00.000Z",
      "lastFastResearchAt": null,
      "enrichedAt": "2026-09-01T12:00:00.000Z"
    }
  }
}
Returns 404 NOT_FOUND when the domain is unknown or the company has no stored report. A company listing does not guarantee research coverage.

API reference · Personal keys

Manage company lists

Group companies into named lists for research, job hunting, or a report about the companies you follow. These endpoints use /api/lists, outside the catalog’s /api/v1 base path.

Use a personal key (pk_live_…). Lists belong to your user, across your organizations. An organization key returns 403. A personal key still requires membership in the organization it was created for.

Every JSON read and write is owner-only, including for public lists. Public visibility makes the website page at /lists/{slug} shareable; it does not grant other API callers access. Website sessions can use these endpoints too; session writes require a matching Origin header.

Set FDE_API_KEY to your personal key. After creating a list, set LIST_ID to its returned UUID. Set COMPANY_ID to a UUID from the catalog’s company list.

GET/api/lists

Get your lists

Returns a data array of your lists, with the default list first and then the most recently updated lists. Up to 100 lists are returned; this endpoint is not paginated. Add ?companyId=UUID to include a hasCompany boolean on each list.

Get your lists · cURL
curl --fail-with-body -X GET \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/lists"
Example response 200 · JSON
Get your lists · JSON
{
  "data": [
    {
      "id": "db113740-3ef5-4d1e-b701-08a8f2d30a12",
      "name": "AI infrastructure",
      "slug": "ai-infrastructure-a94c12",
      "description": "Companies to follow",
      "visibility": "private",
      "isDefault": false,
      "itemCount": 1,
      "createdAt": "2026-09-08T12:00:00.000Z",
      "updatedAt": "2026-09-08T12:00:00.000Z"
    }
  ]
}
POST/api/lists

Create a list

Supply name (required, 1–80 characters after trimming), description (optional, up to 500 characters or null), and visibility (private or public; defaults to private). Names must be unique within your account. You can have up to 100 lists, including Saved.

Create a list · cURL
curl --fail-with-body -X POST \
  -H "X-Api-Key: $FDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"AI infrastructure","description":"Companies to follow","visibility":"private"}' \
  "https://www.enterpriseaitrends.com/api/lists"
GET/api/lists/{id}

Get a list

Returns the list’s metadata under data. Use the id from a create or list response, not the shareable URL slug.

Get a list · cURL
curl --fail-with-body -X GET \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/lists/$LIST_ID"
Example response 200 · JSON
Get a list · JSON
{
  "data": {
    "id": "db113740-3ef5-4d1e-b701-08a8f2d30a12",
    "name": "AI infrastructure",
    "slug": "ai-infrastructure-a94c12",
    "description": "Companies to follow",
    "visibility": "private",
    "isDefault": false,
    "itemCount": 1,
    "createdAt": "2026-09-08T12:00:00.000Z",
    "updatedAt": "2026-09-08T12:00:00.000Z"
  }
}
PATCH/api/lists/{id}

Edit a list

Supply at least one of name, description, or visibility, using the same validation as creation. Set description to null or an empty string to clear it. Renaming keeps the list’s slug and shared URL unchanged. Returns the updated list under data.

Edit a list · cURL
curl --fail-with-body -X PATCH \
  -H "X-Api-Key: $FDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Companies to research","description":null}' \
  "https://www.enterpriseaitrends.com/api/lists/$LIST_ID"
DELETE/api/lists/{id}

Delete a list

Deletes the list and its memberships. Company records are retained. Returns { data: { deleted: true } }. Repeating the deletion returns 404 because the list no longer exists.

Delete a list · cURL
curl --fail-with-body -X DELETE \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/lists/$LIST_ID"
PUT/api/lists/{id}/items/{companyId}

Add a company

Add an active, visible company by UUID. No body is required. A list holds up to 1,000 companies. Repeating an add succeeds even when the list is full, without duplicating the membership or changing its position.

Add a company · cURL
curl --fail-with-body -X PUT \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/lists/$LIST_ID/items/$COMPANY_ID"
Example response 200 · JSON
Add a company · JSON
{
  "data": {
    "listId": "db113740-3ef5-4d1e-b701-08a8f2d30a12",
    "companyId": "3c123740-3ef5-4d1e-b701-08a8f2d30a12",
    "added": true
  }
}
DELETE/api/lists/{id}/items/{companyId}

Remove a company

Remove a membership without deleting the company. No body is required. Returns { data: { listId, companyId, added: false } }. Removing an already-absent company succeeds as long as you still own the list.

Remove a company · cURL
curl --fail-with-body -X DELETE \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/lists/$LIST_ID/items/$COMPANY_ID"
POST/api/lists/save

Save or unsave in your default list

Supply companyId (UUID) and saved (boolean). Ensures a default Saved list exists, then adds or removes the company. If you already have a list named Saved, it becomes the default. Renaming a default list keeps it as the quick-save destination. Implicit creation obeys the 100-list limit, and adding obeys the 1,000-company limit.

Save or unsave in your default list · cURL
curl --fail-with-body -X POST \
  -H "X-Api-Key: $FDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"companyId":"3c123740-3ef5-4d1e-b701-08a8f2d30a12","saved":true}' \
  "https://www.enterpriseaitrends.com/api/lists/save"
Example response 200 · JSON
Save or unsave in your default list · JSON
{
  "data": {
    "listId": "db113740-3ef5-4d1e-b701-08a8f2d30a12",
    "listSlug": "saved-a94c12",
    "saved": true
  }
}
GET/api/lists/{id}/items

Read the companies in a list

Use this endpoint to build a report or fetch the profiles in a saved list. Results are ordered by when the company was added (newest first), then by company UUID to break ties.

Pass page (default 1, range 1–1,000) and limit (default 50, range 1–100). Both must be positive integers. Invalid, repeated, or out-of-range pagination values return 400. A page beyond the available results returns an empty array and the same total.

List companies · cURL
curl --fail-with-body -X GET \
  -H "X-Api-Key: $FDE_API_KEY" \
  "https://www.enterpriseaitrends.com/api/lists/$LIST_ID/items?page=1&limit=50"

The data array contains company profiles. meta contains page, limit, total, and totalPages. Increment page until you reach totalPages. Pagination is consistent while membership is unchanged; additions or removals between requests can shift pages.

List members · JSON
{
  "data": [
    {
      "id": "3c123740-3ef5-4d1e-b701-08a8f2d30a12",
      "name": "Example AI",
      "slug": "example-ai",
      "domain": "example.com",
      "website": "https://example.com",
      "logoUrl": null,
      "description": "Tools for AI developers.",
      "oneLiner": null,
      "hqLocation": null,
      "totalFunding": null,
      "latestValuation": null,
      "headcountRange": null,
      "activeJobCount": 1,
      "addedAt": "2026-09-08T12:00:00.000Z"
    }
  ],
  "meta": {
    "page": 1,
    "limit": 50,
    "total": 1,
    "totalPages": 1
  }
}

Only active, visible companies are returned. List metadata’s itemCount counts all saved memberships, including unavailable companies; the paginated total counts only the companies you can retrieve.

List response fields

List metadata includes id, name, slug, description (string or null), visibility (private or public), isDefault (boolean), and ISO 8601 createdAt and updatedAt timestamps. List and detail reads include itemCount; create and update responses instead include the owner’s userId.

Member records include company identity, website and profile fields, activeJobCount (number), and addedAt (ISO 8601). Profile facts may be null; funding and valuation are display strings rather than numeric amounts.

Limits and errors

All successful list operations return HTTP 200 with a data value. Errors use { error: { code, message } }. List responses are not cached.

List API errors
Status / codeWhat to do
400 · BAD_REQUESTCheck the JSON body, UUIDs, names, description, visibility, and pagination. Supply at least one supported field when editing.
401 · UNAUTHORIZEDSupply a valid personal key or sign in. Expired/revoked keys and keys whose owners lost organization membership fail authentication.
403 · FORBIDDENUse a personal key instead of an organization key. For session writes, send the site’s Origin.
404 · NOT_FOUNDThe list is missing or belongs to another user, or the company cannot be added. Private list existence is not disclosed.
409 · DUPLICATEChoose another name; you already own a list with that name.
413 · PAYLOAD_TOO_LARGEKeep JSON request bodies within 16 KiB.
422 · LIMIT_EXCEEDEDRemove a list or company before creating another. Existing-member add retries still succeed at capacity.
429 · RATE_LIMITEDWait for the number of seconds in Retry-After before retrying.
500 · INTERNALThe request could not complete. Retry after a delay; verify a create succeeded before retrying it to avoid duplicate-name errors.

List endpoints share a separate budget of 100 requests per 60-second window per user, across personal keys and sessions. The budget is shared across server instances. Read X-RateLimit-Limit and X-RateLimit-Remaining; 429 responses also include Retry-After. Authentication and origin failures occur before this budget is charged.

Ready to connect? Create an API key