Endpoints // Search
Agentic Organization Search
NewDescribe the organizations you want in plain language and get full organization profiles back, with the filters we read from your prompt.
- Credits
- 1 credit per page for the search, plus 1 credit per organization delivered.
- Last verified
Introduction
The Agentic Organization Search endpoint takes one sentence, such as Fintech scale-ups headquartered in Berlin, 200 to 500 people, reads it into Organization search filters, runs that search and returns the matching full organization 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 Organization 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 Organization search. To find people rather than organizations, use Agentic Search.
Authorization
| Name | Type | Required | Description |
|---|---|---|---|
apikey | string | Yes | Your API key from the developer dashboard. Pass it via Authorization: Bearer YOUR_API_KEY header. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
prompt | string | Yes | Plain-language description of the organizations to find, in any language. At least 3 characters and at most 1000 tokens |
cursor | string | No | Opaque cursor returned as metadata.nextCursor; request the next page with the same prompt |
perPage | number | No | Organizations 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
422witherror.codeINVALID_PROMPTand costs 0 credits.
No filters: the filters come from the prompt, so the request takes no search filter. Any other field, such as
industryorlocation, returns HTTP422witherror.codePROMPT_FILTERS_NOT_SUPPORTEDand the offending fields inerror.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 Organization search.
What a prompt can express
A prompt is read into these Organization search filters:
| What you describe | Filters it becomes |
|---|---|
| An organization name, or part of it | companyName |
| A website or a domain | companyDomain |
| An industry | industry, from the industry list |
| What the organization specialises in | specialities |
| A company size, in numbers or in words | employeeCountRange |
| A founding year or period | foundedYear |
| An audience size | followersCount |
| A headquarters place | location (country, region or city) |
| How recent the data must be | maxDataAgeDate, 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 Organization 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.
Organization names and places are kept as you write them, in any language. Organizations store their headquarters city in its local spelling, so München matches more organizations 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 Organization Search uses cursor pagination, like Organization search. Each response returns up to perPage organizations (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 organizations 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 Organization Search costs 1 credit per page for the search itself, plus 1 credit per organization delivered. The search credit is charged on every page, including when no organization matches. Organizations removed for compliance reasons before the response are not billed. A page that returns 25 organizations costs 26 credits, and a page that returns no organization 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.filtersis a valid Organization search body. Send it to the free Organization search count endpoint to know how many organizations match in total, or to Organization 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.
| HTTP | error.code | What happened | What to do |
|---|---|---|---|
422 | INVALID_PROMPT | prompt is missing, is not a string, is shorter than 3 characters or longer than 1000 tokens | Send a prompt within the limits |
422 | PROMPT_FILTERS_NOT_SUPPORTED | The body carries a field other than prompt, cursor and perPage. error.details.fields lists them | Describe those criteria in the prompt, or use Organization search |
422 | NO_FILTERS_INTERPRETED | No 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 understood | Name an industry, a place, a company size or a company name |
422 | PROMPT_FILTERS_REJECTED | The filters read from the prompt break a search rule. error.details.errors lists each problem with its field, as in Search filter validation | Rephrase the prompt, or use Organization search |
422 | DISPOSABLE_EMAIL_DOMAIN | The website read from the prompt is a disposable email provider | Name the organization's own website |
422 | INVALID_PAGINATION, PAGINATION_LIMIT_EXCEEDED | perPage is not a whole number, or is above 100 | Send a perPage from 1 to 100 |
400 | REQUEST_ERROR | The cursor does not belong to the filters the prompt was read into (Invalid or expired cursor) | Start again from the first page, without cursor |
502 | PROMPT_INTERPRETATION_FAILED | The prompt could not be read this time | Retry, or rephrase the prompt |
504 | PROMPT_INTERPRETATION_TIMEOUT | Reading the prompt took too long | Retry with backoff |
503 | PROMPT_SEARCH_UNAVAILABLE | Agentic Search is temporarily unavailable | Retry later, or use Organization search with explicit filters |
Response structure
Note: This endpoint uses a nested envelope. The top-level V2
datafield 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.
| Field | Type | Description |
|---|---|---|
success | boolean | true if the request was processed successfully |
error | null | Always null on success |
data.dataobject[]Full organization 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 attributesHide child attributes
| Field | Type | Description |
|---|---|---|
id | string | Reverse Contact company id (com_...). Use it as the id parameter of the Company profile endpoint |
companyName | string | Organization name |
linkedinId | string | Social company identifier |
publicId | string | Universal name / slug (the /company/xxx part of the URL) |
linkedinUrl | string | null | Full Social company URL |
employeesCount | number | null | Exact number of employees |
followersCount | number | null | Number of Social followers |
employeeCountRange | EmployeeCountRange | null | Employee count bracket, with start and end fields |
websiteUrl | string | null | Official website URL |
tagline | string | null | Tagline / slogan |
description | string | null | Full description |
industry | string | null | Industry (e.g. "Software Development") |
phone | string | null | Phone number |
specialities | string | Specialities listed on the profile |
logoUrl | string | null | Logo image URL |
foundedOn | FoundedOn | null | Founding year wrapper, with a year field |
locations | Location | All office locations registered on the profile (can be empty) |
backgroundUrl | string | null | Background / banner image URL |
headquarterobjectHeadquarters location (null if unknown). The location filter matches these fields.
Show child attributesHide child attributes
| Field | Type | Description |
|---|---|---|
street1 | string | null | Primary street address line |
street2 | string | null | Secondary street address line |
postalCode | string | null | Postal code |
city | string | null | City |
geographicArea | string | null | State or region |
country | string | null | Country ISO 3166 code (e.g. "US", "FR") |
data.metadataobjectPagination metadata wrapped under data.metadata in the envelope.
Show child attributesHide child attributes
| Field | Type | Description |
|---|---|---|
perPage | number | Organizations requested per page |
count | number | Organizations returned in this page. Use Organization search count with data.interpretation.filters for the total matching set |
nextCursor | string | null | Opaque cursor for the next page, null on the last page. Send it with the same prompt |
data.interpretationobjectWhat the prompt was read into, the same on every page of a prompt.
Show child attributesHide child attributes
| Field | Type | Description |
|---|---|---|
filters | object | The Organization search filters applied, keyed like the Organization search request body |
warnings | string | What the prompt asked for that the search does not apply, such as funding. Empty when everything was applied |
quotasobjectCredits and rate limit usage after this request
Show child attributesHide child attributes
| Field | Type | Description |
|---|---|---|
creditsConsumed | number | Credits consumed by this request: 1 for the search plus 1 per organization delivered |
workspaceobjectWorkspace-level limits
Show child attributesHide child attributes
| Field | Type | Description |
|---|---|---|
id | string | Your workspace identifier |
hasUnlimitedCredits | boolean | Whether workspace credits are unlimited |
allowDailyOvercost | boolean | Whether the workspace may exceed its daily cap |
creditsobjectCredit balance
Show child attributesHide child attributes
| Field | Type | Description |
|---|---|---|
total | number | Total credits in your plan |
used | number | Credits consumed so far |
left | number | Remaining credits |
dailyLimitobjectDaily request limit (null if not configured)
Show child attributesHide child attributes
| Field | Type | Description |
|---|---|---|
limit | number | Maximum requests per day |
used | number | Requests made today |
left | number | Remaining requests today |
nextReset | string | When the daily window resets (ISO 8601) |
minuteRateLimitobjectPer-minute rate limit
Show child attributesHide child attributes
| Field | Type | Description |
|---|---|---|
limit | number | Maximum requests per minute |
used | number | Requests made in the current minute |
left | number | Remaining requests in the current minute |
nextReset | string | When the minute window resets (ISO 8601) |
keyobjectAPI key-level limits (null when request is from dashboard)
Show child attributesHide child attributes
| Field | Type | Description |
|---|---|---|
id | string | API key identifier |
dailyLimitobjectDaily limit for this key (null if not configured)
Show child attributesHide child attributes
| Field | Type | Description |
|---|---|---|
limit | number | Maximum requests per day |
used | number | Requests made today |
left | number | Remaining requests today |
nextReset | string | When the daily window resets (ISO 8601) |
minuteRateLimitobjectMinute rate limit for this key
Show child attributesHide child attributes
| Field | Type | Description |
|---|---|---|
limit | number | Maximum requests per minute |
used | number | Requests made in the current minute |
left | number | Remaining requests in the current minute |
nextReset | string | When the minute window resets (ISO 8601) |
metadataobjectRequest tracking information (not to be confused with data.metadata which is pagination)
Show child attributesHide child attributes
| Field | Type | Description |
|---|---|---|
requestId | string | Unique identifier for this request |
executionTimeMs | number | Total 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
}'const prompt = "Fintech scale-ups headquartered in Berlin, 200 to 500 people, that raised a Series B";
const promptPage = async (cursor) => {
const response = await fetch("https://api.reversecontact.com/v2/search/organizations/prompt", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
// The same prompt travels with every page, the cursor only from the second one.
body: JSON.stringify({ prompt, perPage: 25, cursor })
});
return response.json();
};
const firstPage = await promptPage();
const { filters, warnings } = firstPage.data.interpretation;
console.log("Filters applied:", filters, "Not applied:", warnings);
const organizations = firstPage.data.data;
const { nextCursor } = firstPage.data.metadata;
if (nextCursor) {
const secondPage = await promptPage(nextCursor);
organizations.push(...secondPage.data.data);
}import requests
response = requests.post(
"https://api.reversecontact.com/v2/search/organizations/prompt",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
json={
"prompt": "Fintech scale-ups headquartered in Berlin, 200 to 500 people, that raised a Series B",
"perPage": 25
}
)
payload = response.json()
interpretation = payload["data"]["interpretation"]
organizations = payload["data"]["data"]
print(f"Filters applied: {interpretation['filters']}")
print(f"Got {len(organizations)} organizations, next cursor: {payload['data']['metadata']['nextCursor']}")Example response
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"
}
}
}
}