Skip to content

Endpoints // Search

Agentic Company Search

New

Describe the companies you want in plain language and get full company profiles back, with the filters we read from your prompt.

POST/v2/search/organizations/prompt
Credits
1 credit per page for the search, plus 1 credit per company delivered.
Last verified

Introduction

The Agentic Company Search endpoint takes one sentence, such as Fintech scale-ups headquartered in Berlin, 200 to 500 people, reads it into Company search filters, runs that search and returns the matching full company profiles. You do not build the filters yourself: the response tells you which ones were applied, in data.interpretation.

Every result is a complete profile, the same shape Company search returns, with the same cursor pagination. Results are drawn from our cache-based search index. This endpoint never triggers a live fetch.

Use it when the request comes from a person typing what they want, or when you prefer not to map criteria to filter names. To control every filter yourself, use Company search. To find people rather than companies, use Agentic Search.

Authorization

NameTypeRequiredDescription
apikeystringYesYour API key from the developer dashboard. Pass it via Authorization: Bearer YOUR_API_KEY header.

Request body

NameTypeRequiredDescription
promptstringYesPlain-language description of the companies to find, in any language. At least 3 characters and at most 1000 tokens
cursorstringNoOpaque cursor returned as metadata.nextCursor; request the next page with the same prompt
perPagenumberNoCompanies per page (1 to 100, default 25)

Prompt length: the 1000 token limit is about 4000 characters of English text. It is counted conservatively: four plain ASCII characters count as one token, and every other character (an accented letter, a non-Latin script) counts as one token on its own. A longer prompt returns HTTP 422 with error.code INVALID_PROMPT and costs 0 credits.

No filters: the filters come from the prompt, so the request takes no search filter. Any other field, such as industry or location, returns HTTP 422 with error.code PROMPT_FILTERS_NOT_SUPPORTED and the offending fields in error.details.fields, and costs 0 credits. A filter is refused rather than ignored, because an ignored filter would return results you did not ask for. Describe it in the prompt instead, or send explicit filters to Company search.

What a prompt can express

A prompt is read into these Company search filters:

What you describeFilters it becomes
A company name, or part of itcompanyName
A website or a domaincompanyDomain
An industryindustry, from the industry list
What the company specialises inspecialities
A company size, in numbers or in wordsemployeeCountRange
A founding year or periodfoundedYear
An audience sizefollowersCount
A headquarters placelocation (country, region or city)
How recent the data must bemaxDataAgeDate, next to at least one other filter

A size word becomes a headcount range: a startup is 1 to 50 employees, a scale-up 51 to 500, a mid-market company 501 to 5000 and an enterprise 5001 and more. Headcount is stored as fixed brackets, and a range only matches the brackets it fully contains (see Company search), so a size word or round bounds such as 200 to 500 people work best. A founding period such as founded after 2015 becomes foundedYear from 2016.

Company names and places are kept as you write them, in any language. Companies store their headquarters city in its local spelling, so München matches more companies than Munich. Industries are read into the closest values of the industry list.

Anything the prompt asks for that no filter covers, such as funding, revenue or headcount growth, is left out of the search and reported in data.interpretation.warnings, so you can see what the results do not take into account.

Pagination and credits

Agentic Company Search uses cursor pagination, like Company search. Each response returns up to perPage companies (1 to 100, default 25) and a metadata.nextCursor value. To get the following page, send the same prompt again with that value as cursor; nextCursor is null on the last page. The cursor is opaque: send it back unchanged, without parsing or altering it. There is no page parameter, and perPage may change from one page to the next.

The cursor does not expire, and a long pause between two pages is fine: the next page picks up where the previous one stopped. If companies were refreshed in the meantime, one of them can occasionally repeat or be skipped at the page boundary. What a cursor needs is the same filters. A prompt keeps the filters it was first read into for 24 hours in your workspace, so resending it unchanged, from any of your API keys, always runs the same search. Spaces and line breaks do not count as a change. If you edit the prompt, or come back after 24 hours, the prompt is read again, and a cursor sent with filters other than the ones that produced it returns HTTP 400 and costs 0 credits: start again from the first page, without cursor.

perPage above 100 returns HTTP 422 with error.code PAGINATION_LIMIT_EXCEEDED, and a perPage that is not a whole number returns HTTP 422 with error.code INVALID_PAGINATION.

Agentic Company Search costs 1 credit per page for the search itself, plus 1 credit per company delivered. The search credit is charged on every page, including when no company matches. Companies removed for compliance reasons before the response are not billed. A page that returns 25 companies costs 26 credits, and a page that returns no company costs 1 credit. Before it runs, a request needs perPage plus 1 credits available: with fewer, it returns HTTP 402 with INSUFFICIENT_CREDITS and costs nothing. A request refused before the search runs, for any of the reasons listed under Errors, costs 0 credits. Lower perPage to control how many credits a single request can spend.

Tip: data.interpretation.filters is a valid Company search body. Send it to the free Company search count endpoint to know how many companies match in total, or to Company search to adjust a filter by hand.

Errors

Every error below answers before the search runs, and costs 0 credits. When the prompt was read, error.details.interpretation carries the filters and warnings it produced, so you can see why it could not run.

HTTPerror.codeWhat happenedWhat to do
422INVALID_PROMPTprompt is missing, is not a string, is shorter than 3 characters or longer than 1000 tokensSend a prompt within the limits
422PROMPT_FILTERS_NOT_SUPPORTEDThe body carries a field other than prompt, cursor and perPage. error.details.fields lists themDescribe those criteria in the prompt, or use Company search
422NO_FILTERS_INTERPRETEDNo filter could be read from the prompt, and a search without filters would scan the whole database. A data freshness on its own does not count as a filter. error.details.interpretation.warnings says what was not understoodName an industry, a place, a company size or a company name
422PROMPT_FILTERS_REJECTEDThe filters read from the prompt break a search rule. error.details.errors lists each problem with its field, as in Search filter validationRephrase the prompt, or use Company search
422DISPOSABLE_EMAIL_DOMAINThe website read from the prompt is a disposable email providerName the company's own website
422INVALID_PAGINATION, PAGINATION_LIMIT_EXCEEDEDperPage is not a whole number, or is above 100Send a perPage from 1 to 100
400REQUEST_ERRORThe cursor does not belong to the filters the prompt was read into (Invalid or expired cursor)Start again from the first page, without cursor
502PROMPT_INTERPRETATION_FAILEDThe prompt could not be read this timeRetry, or rephrase the prompt
504PROMPT_INTERPRETATION_TIMEOUTReading the prompt took too longRetry with backoff
503PROMPT_SEARCH_UNAVAILABLEAgentic Search is temporarily unavailableRetry later, or use Company search with explicit filters

Response structure

Note: This endpoint uses a nested envelope. The top-level V2 data field wraps an inner search payload that contains the actual results array (data.data), the pagination info (data.metadata) and the filters read from the prompt (data.interpretation). See the example response for the exact shape.

FieldTypeDescription
successbooleantrue if the request was processed successfully
errornullAlways null on success
data.dataobject[]

Full company profiles returned for this page, wrapped under data.data in the envelope. Empty array if no match. Each item is the same full profile shape as the Company profile endpoint; the table below lists its main fields.

Show child attributes
FieldTypeDescription
idstringReverse Contact company id (com_...). Use it as the id parameter of the Company profile endpoint
companyNamestringCompany name
linkedinIdstringSocial company identifier
publicIdstringUniversal name / slug (the /company/xxx part of the URL)
linkedinUrlstring | nullFull Social company URL
employeesCountnumber | nullExact number of employees
followersCountnumber | nullNumber of Social followers
employeeCountRangeEmployeeCountRange | nullEmployee count bracket, with start and end fields
websiteUrlstring | nullOfficial website URL
taglinestring | nullTagline / slogan
descriptionstring | nullFull description
industrystring | nullIndustry (e.g. "Software Development")
phonestring | nullPhone number
specialitiesstringSpecialities listed on the profile
logoUrlstring | nullLogo image URL
foundedOnFoundedOn | nullFounding year wrapper, with a year field
locationsLocationAll office locations registered on the profile (can be empty)
backgroundUrlstring | nullBackground / banner image URL
headquarterobject

Headquarters location (null if unknown). The location filter matches these fields.

Show child attributes
FieldTypeDescription
street1string | nullPrimary street address line
street2string | nullSecondary street address line
postalCodestring | nullPostal code
citystring | nullCity
geographicAreastring | nullState or region
countrystring | nullCountry ISO 3166 code (e.g. "US", "FR")
data.metadataobject

Pagination metadata wrapped under data.metadata in the envelope.

Show child attributes
FieldTypeDescription
perPagenumberCompanies requested per page
countnumberCompanies returned in this page. Use Company search count with data.interpretation.filters for the total matching set
nextCursorstring | nullOpaque cursor for the next page, null on the last page. Send it with the same prompt
data.interpretationobject

What the prompt was read into, the same on every page of a prompt.

Show child attributes
FieldTypeDescription
filtersobjectThe Company search filters applied, keyed like the Company search request body
warningsstringWhat the prompt asked for that the search does not apply, such as funding. Empty when everything was applied
quotasobject

Credits and rate limit usage after this request

Show child attributes
FieldTypeDescription
creditsConsumednumberCredits consumed by this request: 1 for the search plus 1 per company delivered
workspaceobject

Workspace-level limits

Show child attributes
FieldTypeDescription
idstringYour workspace identifier
hasUnlimitedCreditsbooleanWhether workspace credits are unlimited
allowDailyOvercostbooleanWhether the workspace may exceed its daily cap
creditsobject

Credit balance

Show child attributes
FieldTypeDescription
totalnumberTotal credits in your plan
usednumberCredits consumed so far
leftnumberRemaining credits
dailyLimitobject

Daily request limit (null if not configured)

Show child attributes
FieldTypeDescription
limitnumberMaximum requests per day
usednumberRequests made today
leftnumberRemaining requests today
nextResetstringWhen the daily window resets (ISO 8601)
minuteRateLimitobject

Per-minute rate limit

Show child attributes
FieldTypeDescription
limitnumberMaximum requests per minute
usednumberRequests made in the current minute
leftnumberRemaining requests in the current minute
nextResetstringWhen the minute window resets (ISO 8601)
keyobject

API key-level limits (null when request is from dashboard)

Show child attributes
FieldTypeDescription
idstringAPI key identifier
dailyLimitobject

Daily limit for this key (null if not configured)

Show child attributes
FieldTypeDescription
limitnumberMaximum requests per day
usednumberRequests made today
leftnumberRemaining requests today
nextResetstringWhen the daily window resets (ISO 8601)
minuteRateLimitobject

Minute rate limit for this key

Show child attributes
FieldTypeDescription
limitnumberMaximum requests per minute
usednumberRequests made in the current minute
leftnumberRemaining requests in the current minute
nextResetstringWhen the minute window resets (ISO 8601)
metadataobject

Request tracking information (not to be confused with data.metadata which is pagination)

Show child attributes
FieldTypeDescription
requestIdstringUnique identifier for this request
executionTimeMsnumberTotal execution time in milliseconds

Code examples

Code Examples

curl -X POST https://api.reversecontact.com/v2/search/organizations/prompt \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Fintech scale-ups headquartered in Berlin, 200 to 500 people, that raised a Series B",
    "perPage": 25
  }'

Example response

200 - Success

Example Response

{
  "success": true,
  "data": {
    "data": [
      {
        "id": "com_01jbd6k2q9x4r7t1v3w5y8z0ab",
        "companyName": "Ledgerline",
        "linkedinId": "34567890",
        "publicId": "ledgerline",
        "linkedinUrl": "https://www.social.com/company/ledgerline",
        "employeesCount": 318,
        "followersCount": 14250,
        "employeeCountRange": {
          "start": 201,
          "end": 500
        },
        "websiteUrl": "https://www.ledgerline.example",
        "tagline": "Payments infrastructure for European marketplaces",
        "description": "Ledgerline builds payment and payout infrastructure for marketplaces across Europe. Founded in 2018 in Berlin.",
        "industry": "Financial Services",
        "phone": null,
        "specialities": ["Payments", "Fintech", "Marketplaces"],
        "headquarter": {
          "street1": "Friedrichstraße 68",
          "street2": null,
          "postalCode": "10117",
          "city": "Berlin",
          "geographicArea": "Berlin",
          "country": "DE"
        },
        "logoUrl": "https://media.licdn.com/dms/image/v2/C4D0BAQ.../logo.jpg",
        "foundedOn": {
          "year": 2018
        },
        "locations": [
          {
            "street1": "Friedrichstraße 68",
            "street2": null,
            "postalCode": "10117",
            "city": "Berlin",
            "state": "Berlin",
            "country": "DE"
          }
        ],
        "backgroundUrl": null
      }
    ],
    "metadata": {
      "perPage": 25,
      "count": 1,
      "nextCursor": "cur_01j9y2b7c4d8f0g3h6k9m2n5"
    },
    "interpretation": {
      "filters": {
        "industry": "Financial Services",
        "employeeCountRange": { "min": 200, "max": 500 },
        "location": { "countryCode": "DE", "city": "Berlin" }
      },
      "warnings": ["Not available as filters yet: Series B."]
    }
  },
  "error": null,
  "metadata": {
    "requestId": "req_o1p2r3o4m5p6",
    "executionTimeMs": 2690
  },
  "quotas": {
    "creditsConsumed": 2,
    "workspace": {
      "id": "ws_abc123",
      "credits": {
        "total": 10000,
        "used": 4524,
        "left": 5476
      },
      "dailyLimit": null,
      "minuteRateLimit": {
        "limit": 60,
        "used": 5,
        "left": 55,
        "nextReset": "2026-10-16T14:16:00.000Z"
      },
      "hasUnlimitedCredits": false,
      "allowDailyOvercost": false
    },
    "key": {
      "id": "key_abc123",
      "dailyLimit": null,
      "minuteRateLimit": {
        "limit": 60,
        "used": 5,
        "left": 55,
        "nextReset": "2026-10-16T14:16:00.000Z"
      }
    }
  }
}