{"openapi": "3.1.0", "info": {"title": "Evaboot Public API", "version": "1.1.0", "description": "Documentation for the Evaboot Public API\n\n# Authentication\n\nAll API requests must include an **Authorization** header with Bearer\nauthentication:\n\n`Authorization: Bearer xyz`\n\nReplace `xyz` with your API key from the Evaboot dashboard, under\n**Integrations \u2192 API**."}, "paths": {"/v1/extractions/recurring/": {"post": {"operationId": "recurring_exports_create", "summary": "Create a recurring export", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RecurringExportCreateOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "404": {"description": "No such resource, or it belongs to another account.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "409": {"description": "No usable Sales Navigator seat (never connected, or expired).", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Schedule an extraction you already launched, or a Sales Navigator people or company search URL, so Evaboot repeats it `daily`, `weekly`, or `monthly`. Pass exactly one of `extraction_id` or `url`.\n\nThis does not scrape. The next run is one interval after this call and contains only leads new since now, including when the original extraction is still in progress. Each run uses your connected Sales Navigator account, spends credits, and counts against the daily quota. With no credits or no connected account, that run is skipped and the next date still moves forward.\n\nA URL that already contains `savedSearchId` is scheduled as that saved search. Nothing is saved again. Any other people or company search, including a people search filtered on an account list, is saved once on your Sales Navigator seat and then scheduled as that search. A search you already automate is not duplicated: the existing schedule's cadence is updated and `created` is `false`.\n\nLists and single profiles are rejected, and so is a search filtered on the temporary company lists of an account-based search agent job: schedule its `accounts_url` instead.", "tags": ["LinkedIn Extraction"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RecurringExportCreateIn"}}}, "required": true}, "security": [{"PublicBearer": []}]}, "get": {"operationId": "recurring_exports_list", "summary": "List recurring exports", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/RecurringExportOut"}, "title": "Response", "type": "array"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Every recurring export on your account that can still run, soonest next run first. Paused schedules are included. Stopped ones are not.\n\nSynchronous and free.", "tags": ["LinkedIn Extraction"], "security": [{"PublicBearer": []}]}}, "/v1/extractions/recurring/{schedule_id}/": {"get": {"operationId": "recurring_exports_retrieve", "summary": "Get a recurring export", "parameters": [{"in": "path", "name": "schedule_id", "schema": {"format": "uuid", "title": "Schedule Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RecurringExportOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "404": {"description": "No such resource, or it belongs to another account.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "One recurring export. Unknown, stopped, and another account's ids are not found.", "tags": ["LinkedIn Extraction"], "security": [{"PublicBearer": []}]}, "patch": {"operationId": "recurring_exports_update", "summary": "Update a recurring export", "parameters": [{"in": "path", "name": "schedule_id", "schema": {"format": "uuid", "title": "Schedule Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RecurringExportOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "404": {"description": "No such resource, or it belongs to another account.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Change the name, the cadence, or whether the schedule is paused. Omit a field to leave it. Sending the current value changes nothing, including an already-active schedule whose next run is overdue.\n\nRenaming also renames the template extraction, which is the name the next run is created with. Changing the cadence recomputes the next run.", "tags": ["LinkedIn Extraction"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RecurringExportUpdateIn"}}}, "required": true}, "security": [{"PublicBearer": []}]}, "delete": {"operationId": "recurring_exports_delete", "summary": "Delete a recurring export", "parameters": [{"in": "path", "name": "schedule_id", "schema": {"format": "uuid", "title": "Schedule Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RecurringExportDeleteOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "404": {"description": "No such resource, or it belongs to another account.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Stop a recurring export permanently. Runs already produced stay. Integrations pinned to it stop receiving it, and turn manual when it was their only schedule. There is no way to restore the schedule.", "tags": ["LinkedIn Extraction"], "security": [{"PublicBearer": []}]}}, "/v1/extractions/url/": {"post": {"operationId": "extractions_url_create", "summary": "Extract a Sales Navigator search or list", "parameters": [], "responses": {"202": {"description": "Accepted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ExtractionCreateOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "402": {"description": "Not enough credits to cover the request.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "409": {"description": "No usable Sales Navigator seat (never connected, or expired).", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "429": {"description": "A daily quota or rate limit is exhausted.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "503": {"description": "A dependency was unavailable. The request can be retried.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Extract every lead or account behind a Sales Navigator search URL, saved search URL, or lead/account list URL.\n\nThe URL is checked against Sales Navigator while you wait, so an unusable search is rejected immediately rather than failing later. Everything after that runs in the background: the response returns an `extraction_id` straight away, and you either poll `GET /v1/extractions/{extraction_id}/` until its status is `EXECUTED` or supply a `webhook_url` and be notified when the results are ready. Large searches take several minutes.\n\nEvery lead gets a verified professional email where one exists.\n\n**Cost:** 1 credit per lead or account extracted, emails included. A search's true size is unknown until it has been paged through, so the request only needs a positive balance to start; the credits are debited when the results are ready.", "tags": ["LinkedIn Extraction"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UrlExtractionCreateIn"}}}, "required": true}, "security": [{"PublicBearer": []}]}}, "/v1/extractions/single/": {"post": {"operationId": "extractions_single_create", "summary": "Extract a single Sales Navigator profile", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SingleExtractionOut"}}}}, "202": {"description": "Accepted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ExtractionCreateOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "402": {"description": "Not enough credits to cover the request.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "409": {"description": "No usable Sales Navigator seat (never connected, or expired).", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "429": {"description": "A daily quota or rate limit is exhausted.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Extract one Sales Navigator lead or account and get the full record back in the response.\n\nThis is the only extraction endpoint that is synchronous: there is nothing to poll and no webhook to wire up, so it suits enriching a single record inside a live workflow. Expect it to take a few seconds.\n\n**Slow lookups:** if the scrape and email lookup are still running after about 25 seconds you get `202` with an `extraction_id` instead. It carries on and is billed the same way; poll `GET /v1/extractions/{extraction_id}/` for the prospect. Use `POST /v1/extractions/profiles/` for more than one profile at a time.\n\nThe returned `prospect` object carries the identity, role, tenure and company fields Evaboot collects, plus a verified email address and its status where one exists.\n\n**Cost:** 1 credit, email included.", "tags": ["LinkedIn Extraction"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SingleExtractionCreateIn"}}}, "required": true}, "security": [{"PublicBearer": []}]}}, "/v1/extractions/profiles/": {"post": {"operationId": "extractions_profiles_create", "summary": "Extract a list of Sales Navigator profiles", "parameters": [], "responses": {"202": {"description": "Accepted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ExtractionCreateOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "402": {"description": "Not enough credits to cover the request.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "409": {"description": "No usable Sales Navigator seat (never connected, or expired).", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "429": {"description": "A daily quota or rate limit is exhausted.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Extract a specific set of Sales Navigator leads or accounts, given their URLs or ids, without going through a search.\n\nUse it when you already know exactly who you want: up to 2500 entries per request, all leads or all accounts, never a mix. Public `linkedin.com/in/...` profile URLs are rejected.\n\nThe work runs in the background: the response returns an `extraction_id` straight away, and you either poll `GET /v1/extractions/{extraction_id}/` until its status is `EXECUTED` or supply a `webhook_url` and be notified when the results are ready.\n\nEvery lead gets a verified professional email where one exists.\n\n**Cost:** 1 credit per profile submitted, emails included. The whole batch is refused if your balance does not cover it.", "tags": ["LinkedIn Extraction"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProfileExtractionCreateIn"}}}, "required": true}, "security": [{"PublicBearer": []}]}}, "/v1/extractions/": {"get": {"operationId": "extractions_list", "summary": "List LinkedIn extraction jobs", "parameters": [{"in": "query", "name": "start", "schema": {"default": 0, "title": "Start", "type": "integer"}, "required": false}, {"in": "query", "name": "limit", "schema": {"default": 25, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "status", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/ExtractionListItemOut"}, "title": "Response", "type": "array"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "List the extractions on your account, newest first.\n\nReturns a summary of each one (name, status, type, estimated size, creation date) rather than the extracted records; fetch those from `GET /v1/extractions/{extraction_id}/`. Page with `start` and `limit` (25 per page by default).\n\n`status` narrows the list. It takes the lowercase job states `pending`, `scheduled`, `processing`, `completed`, `paused` and `failed`. Note that these are not the uppercase values the responses report.\n\nSynchronous and free: listing costs no credits.", "tags": ["LinkedIn Extraction"], "security": [{"PublicBearer": []}]}}, "/v1/extractions/{extraction_id}/enrich": {"post": {"operationId": "extractions_enrich", "summary": "Find emails for an existing extraction (removed)", "parameters": [{"in": "path", "name": "extraction_id", "schema": {"title": "Extraction Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK"}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Removed. Every new lead extraction now finds and verifies emails for every lead, so this always answers 422.", "tags": ["LinkedIn Extraction"], "deprecated": true, "security": [{"PublicBearer": []}]}}, "/v1/extractions/{extraction_id}/": {"get": {"operationId": "extractions_retrieve", "summary": "Get LinkedIn extraction job results", "parameters": [{"in": "path", "name": "extraction_id", "schema": {"title": "Extraction Id", "type": "string"}, "required": true}, {"in": "query", "name": "start", "schema": {"default": 0, "title": "Start", "type": "integer"}, "required": false}, {"in": "query", "name": "limit", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Limit"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ExtractionDetailOut"}}}}, "202": {"description": "Accepted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ExtractionInProgressOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "404": {"description": "No such resource, or it belongs to another account.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Fetch an extraction's status and, once it has finished, its extracted records. This is the endpoint you poll after creating an extraction, and it returns the same data a `webhook_url` would have delivered.\n\nThe status code tells you which of two payloads you get:\n\n- **202**: still running. You get the status and a `progress` percentage, and should poll again shortly.\n- **200**: finished. You get the full payload including `prospects`.\n\nEach record maps human-readable column names to values: identity, role and tenure, company details, and the email address plus its verification status when the extraction was created with `enrich_email`. Which columns appear depends on whether leads or accounts were extracted.\n\nFor large extractions, page the records with the optional `start` and `limit` query parameters; `total_count` and `has_more` then describe the whole result set. Omit `limit` and every record is returned in one response. `limit=0` returns the status, progress and counts with an empty `prospects` list.\n\nSynchronous and free: reading results costs no credits.", "tags": ["LinkedIn Extraction"], "security": [{"PublicBearer": []}]}}, "/v1/email-finder/": {"post": {"operationId": "email_finder_create", "summary": "Find emails in bulk", "parameters": [], "responses": {"202": {"description": "Accepted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EmailFinderJobAcceptedOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Create a job that finds email addresses for a list of prospects. Each prospect needs a first name, a last name, and a company name or company domain \u2014 sending the domain as well improves accuracy.\n\nThe lookups run in the background, so the call returns straight away with `202` and a `job_id`. Poll `GET /v1/email-finder/{job_id}/` for progress and results: it answers `202` while the job is still running and `200` once every prospect is done.\n\n**Webhook support:** include a `webhook_url` and we POST the finished job to it instead, with the same payload as the retrieve endpoint, so you do not have to poll.\n\n**Cost:** 1 credit per deliverable email found. Prospects with no email, or an email that fails verification, are not charged. Credits are taken when the job finishes.", "tags": ["Email Finder"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/EmailFinderJobIn"}}}, "required": true}, "security": [{"PublicBearer": []}]}, "get": {"operationId": "email_finder_list", "summary": "List Email Finder jobs", "parameters": [{"in": "query", "name": "limit", "schema": {"default": 25, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "offset", "schema": {"default": 0, "title": "Offset", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/EmailFinderJobSummaryOut"}, "title": "Response", "type": "array"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "List the email finder jobs on your account, newest first, with each job's status and progress. Prospect results are not included: fetch one job with `GET /v1/email-finder/{job_id}/` for those.\n\nUse `limit` and `offset` to page through them (25 per page by default). Reading the list is free.", "tags": ["Email Finder"], "security": [{"PublicBearer": []}]}}, "/v1/email-finder/single/": {"post": {"operationId": "email_finder_single_create", "summary": "Find an email", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EmailFinderOut"}}}}, "202": {"description": "Accepted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SingleEmailJobDeferredOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "402": {"description": "Not enough credits to cover the request.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Find and verify the email address of one person from their first name, last name and company. The call is synchronous: the address and its deliverability verdict come back in the response.\n\n**Slow lookups:** if the lookup is still running after about 25 seconds you get `202` with a `job_id` instead. The lookup carries on and is billed the same way; poll `GET /v1/email-finder/{job_id}/` for the result.\n\n**Company information:** supply `company_name` or `company_domain` \u2014 at least one is needed, and giving both finds the right address more often.\n\nA person we cannot find an address for is not an error: the response still arrives with `prospect.status` set to `failed`, `prospect.found_email` `null`, and the reason in `prospect.error_message`.\n\n**Cost:** 1 credit when a deliverable email is found, nothing when it is not. Use `POST /v1/email-finder/` instead when you have more than a handful of people to look up.", "tags": ["Email Finder"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/EmailFinderIn"}}}, "required": true}, "security": [{"PublicBearer": []}]}}, "/v1/email-finder/{job_id}/": {"get": {"operationId": "email_finder_retrieve", "summary": "Get Email Finder job results", "parameters": [{"in": "path", "name": "job_id", "schema": {"title": "Job Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EmailFinderJobOut"}}}}, "202": {"description": "Accepted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EmailFinderJobInProgressOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "402": {"description": "Not enough credits to cover the request.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "404": {"description": "No such resource, or it belongs to another account.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Retrieve one email finder job by the `job_id` you got when you created it. This is the polling endpoint for a bulk job, and for a single lookup that answered `202`. A single lookup whose credits could not be taken returns `402` instead of its result.\n\nWhile the job is queued or running you get `202` with its status and `progress` percentage. Once every prospect has been processed you get `200` with the full result list, each entry carrying the email found and its deliverability verdict. Polling once every few seconds is plenty.\n\nReading a job is free \u2014 the credits for the emails found were already taken when the job finished.", "tags": ["Email Finder"], "security": [{"PublicBearer": []}]}}, "/v1/email-validation/": {"post": {"operationId": "email_validation_create", "summary": "Verify emails in bulk", "parameters": [], "responses": {"202": {"description": "Accepted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EmailValidationJobAcceptedOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Create a job that verifies a list of email addresses and tells you whether each one is deliverable.\n\nVerification runs in the background, so this call returns `202` with a `job_id` as soon as the job is accepted. Poll `GET /v1/email-validation/{job_id}/` for progress and results, or supply a `webhook_url` and be notified when the job finishes.\n\nEach address checked costs 1 credit, whatever the verdict. An address the check could not complete (`error`) is not charged. The charge is applied when the job completes.", "tags": ["Email Verifier"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/EmailValidationJobIn"}}}, "required": true}, "security": [{"PublicBearer": []}]}, "get": {"operationId": "email_validation_list", "summary": "List email validation jobs", "parameters": [{"in": "query", "name": "limit", "schema": {"default": 25, "title": "Limit", "type": "integer"}, "required": false}, {"in": "query", "name": "offset", "schema": {"default": 0, "title": "Offset", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/EmailValidationJobSummaryOut"}, "title": "Response", "type": "array"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "List the bulk email-verification jobs on your account, newest first, each with its status, progress and number of addresses. Per-address results are not included: fetch one job with `GET /v1/email-validation/{job_id}/` for those.\n\nSynchronous and free: listing jobs costs no credits. Use `limit` (25 by default) and `offset` to page through the history. Addresses verified one at a time do not create a job and so never appear here.", "tags": ["Email Verifier"], "security": [{"PublicBearer": []}]}}, "/v1/email-validation/single/": {"post": {"operationId": "email_validation_single_create", "summary": "Verify an email", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EmailValidationOut"}}}}, "202": {"description": "Accepted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SingleEmailJobDeferredOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "402": {"description": "Not enough credits to cover the request.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Verify one email address and get its deliverability verdict.\n\nThis call is synchronous: the verdict comes back in the response. Use it for one-off checks, such as validating an address a user just typed in. For a list of addresses use `POST /v1/email-validation/` instead, which verifies them in the background.\n\n**Slow checks:** if the check is still running after about 25 seconds you get `202` with a `job_id` instead. The check carries on and is billed the same way; poll `GET /v1/email-validation/{job_id}/` for the verdict.\n\nVerifying an address costs 1 credit, whatever the verdict.", "tags": ["Email Verifier"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/EmailValidationIn"}}}, "required": true}, "security": [{"PublicBearer": []}]}}, "/v1/email-validation/{job_id}/": {"get": {"operationId": "email_validation_retrieve", "summary": "Get email validation job results", "parameters": [{"in": "path", "name": "job_id", "schema": {"title": "Job Id", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EmailValidationJobOut"}}}}, "202": {"description": "Accepted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EmailValidationJobInProgressOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "402": {"description": "Not enough credits to cover the request.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "404": {"description": "No such resource, or it belongs to another account.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Retrieve one bulk email-verification job, using the `job_id` returned when you created it.\n\nThis is the polling endpoint. While the job is still queued or running it returns `202` with the current `status` and `progress`; once every address has been processed it returns `200` with the full list of verdicts. Poll every few seconds, or supply a `webhook_url` at creation time and skip polling altogether. It also serves a single verification that answered `202`; one whose credits could not be taken returns `402` instead of its verdict.\n\nSynchronous and free: reading a job costs no credits. The credits for the addresses verified were charged when the job completed.", "tags": ["Email Verifier"], "security": [{"PublicBearer": []}]}}, "/v1/quota/": {"get": {"operationId": "quota_retrieve", "summary": "Get user quota information", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/QuotaOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Retrieve your current usage limits: the daily extraction quota, your Evaboot credit balance, and the Sales Navigator accounts available to extract with.\n\nCall this before launching an extraction to confirm the job will fit. Two separate limits apply: **credits** are consumed by the work itself (1 credit per extracted profile with its email included, 1 per email found by the email finder, 1 per email validated), while the **daily quota** caps how many profiles a single Sales Navigator account may extract in 24 hours. Because an extraction runs on one account, a job can only be as large as the `remaining` of one entry in `salesnavs` \u2014 the top-level `remaining` is the sum across accounts.\n\nWith no valid Sales Navigator account, `has_valid_salesnav` is `false` and `remaining` is `0`. Sign in to this same Evaboot account, open a Sales Navigator search in Chrome with the Evaboot extension installed, and click Export with Evaboot. That writes the cookies. Installing the extension or opening Sales Navigator does not, by itself.\n\nSynchronous and free \u2014 this endpoint costs no credits and does not count against your daily quota.", "tags": ["Account"], "security": [{"PublicBearer": []}]}}, "/v1/account/linkedin-session/": {"post": {"operationId": "account_linkedin_session_update", "summary": "Save LinkedIn session cookies", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LinkedInSessionOut"}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "409": {"description": "No usable Sales Navigator seat (never connected, or expired).", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "503": {"description": "A dependency was unavailable. The request can be retried.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Store a LinkedIn session for the Evaboot account this API key belongs to, without the Chrome extension.\n\nSend the `li_a` and `li_at` cookies copied from the signed-in browser: on a LinkedIn page, right-click, choose Inspect, open Application, then Cookies for https://www.linkedin.com.\n\nLinkedIn must accept the pair. A rejection leaves the stored session unchanged. The response does not echo the cookies.", "tags": ["Account"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/LinkedInSessionIn"}}}, "required": true}, "security": [{"PublicBearer": []}]}}, "/v1/search-builder/": {"post": {"operationId": "search_builder_create", "summary": "Generate a Sales Navigator search URL", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SearchBuilderOut"}}}}, "400": {"description": "The request could not be processed.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "401": {"description": "The API key is missing, malformed or unknown.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "422": {"description": "The request body or a supplied URL failed validation.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}, "429": {"description": "A daily quota or rate limit is exhausted.", "content": {"application/json": {"schema": {"type": "object", "properties": {"success": {"type": "boolean", "example": false}, "error": {"type": "object", "properties": {"type": {"type": "string", "description": "Machine-readable error class.", "example": "InsufficientCredits"}, "message": {"type": "string", "description": "Human-readable explanation."}}, "required": ["type", "message"]}}, "required": ["success", "error"]}}}}}, "description": "Generate a LinkedIn Sales Navigator search URL from a natural language description.\n\nYour description is translated into structured Sales Navigator filters (industry, seniority, company size, region, etc.) and a valid URL is returned, together with a summary of the filters that were chosen. Use it to go from a description of your ideal customer to a search you can open in Sales Navigator or hand straight to the URL extraction endpoint.\n\nThe URL is built and returned in the same request: this endpoint is synchronous and there is no job to poll.\n\n**Costs no credits.** Limited to 100 requests per day per user.\n\nSupported filter types: INDUSTRY, COMPANY_HEADCOUNT, COMPANY_TYPE, SENIORITY_LEVEL, FUNCTION, REGION, COMPANY_HEADQUARTERS, CURRENT_TITLE, CURRENT_COMPANY, YEARS_AT_CURRENT_COMPANY, YEARS_IN_CURRENT_POSITION, ANNUAL_REVENUE.", "tags": ["Search Builder"], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SearchBuilderIn"}}}, "required": true}, "security": [{"PublicBearer": []}]}}}, "components": {"schemas": {"RecurringDestinationOut": {"description": "An integration that receives this schedule's runs.", "properties": {"id": {"description": "Integration id.", "format": "uuid", "title": "Id", "type": "string"}, "type": {"description": "Integration type.", "examples": ["hubspot"], "title": "Type", "type": "string"}, "label": {"description": "Integration name.", "examples": ["Sales CRM"], "title": "Label", "type": "string"}}, "required": ["id", "type", "label"], "title": "RecurringDestinationOut", "type": "object"}, "RecurringExportCreateOut": {"description": "Create response. ``created`` is false when an existing schedule was updated.", "properties": {"id": {"description": "Schedule id. Pass it to get, update, and delete.", "format": "uuid", "title": "Id", "type": "string"}, "name": {"description": "Name copied onto each future run.", "examples": ["Weekly CTOs"], "title": "Name", "type": "string"}, "frequency": {"description": "`daily`, `weekly`, or `monthly`.", "examples": ["weekly"], "title": "Frequency", "type": "string"}, "paused": {"description": "When `true`, the scheduler skips this schedule.", "examples": [false], "title": "Paused", "type": "boolean"}, "search_url": {"description": "The saved search on LinkedIn, without the new-since-last-run filter.", "title": "Search Url", "type": "string"}, "lead_search": {"description": "`true` for a people search, `false` for a company search.", "examples": [true], "title": "Lead Search", "type": "boolean"}, "template_extraction_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The extraction this schedule was started from, when it still exists. Same id `GET /v1/extractions/{extraction_id}/` accepts.", "title": "Template Extraction Id"}, "last_execution_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the schedule last launched a run. Null before the first automatic run.", "title": "Last Execution At"}, "next_execution_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the next run is due. A paused schedule still reports the date it would have used.", "title": "Next Execution At"}, "runs": {"default": 0, "description": "Exports this schedule has already produced.", "examples": [3], "title": "Runs", "type": "integer"}, "leads": {"default": 0, "description": "Leads collected across those runs.", "examples": [120], "title": "Leads", "type": "integer"}, "destinations": {"description": "Automatic integrations that receive each run: those sending all exports, all recurring exports, this recurring export, or the folder its runs are filed in. People-only integrations are left out of a company search.", "items": {"$ref": "#/components/schemas/RecurringDestinationOut"}, "title": "Destinations", "type": "array"}, "created": {"description": "`true` when a new schedule was stored. `false` when this search was already recurring and only the cadence changed.", "examples": [true], "title": "Created", "type": "boolean"}}, "required": ["id", "name", "frequency", "paused", "search_url", "lead_search", "created"], "title": "RecurringExportCreateOut", "type": "object"}, "RecurringExportCreateIn": {"description": "Schedule an extraction the caller already launched, or a search URL.", "properties": {"extraction_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Identifier of an existing extraction, as returned by `POST /v1/extractions/url/` and by the list endpoint's `search_id`. People and company searches only. Lists and single profiles cannot recur. Pass this or `url`, not both.", "examples": ["ext-12345"], "title": "Extraction Id"}, "url": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "A Sales Navigator people or company search URL. When it already contains `savedSearchId`, that saved search is scheduled and nothing is saved again. Any other people or company search is saved once on your Sales Navigator seat, then scheduled. A people search filtered on an account list stays that lead search. Pass this or `extraction_id`, not both.", "examples": ["https://www.linkedin.com/sales/search/people?savedSearchId=2012510114"], "title": "Url"}, "frequency": {"description": "How often a new export of leads found since the previous run is launched.", "enum": ["daily", "weekly", "monthly"], "examples": ["weekly"], "title": "Frequency", "type": "string"}}, "required": ["frequency"], "title": "RecurringExportCreateIn", "type": "object"}, "RecurringExportOut": {"description": "One recurring export the caller can still manage.", "properties": {"id": {"description": "Schedule id. Pass it to get, update, and delete.", "format": "uuid", "title": "Id", "type": "string"}, "name": {"description": "Name copied onto each future run.", "examples": ["Weekly CTOs"], "title": "Name", "type": "string"}, "frequency": {"description": "`daily`, `weekly`, or `monthly`.", "examples": ["weekly"], "title": "Frequency", "type": "string"}, "paused": {"description": "When `true`, the scheduler skips this schedule.", "examples": [false], "title": "Paused", "type": "boolean"}, "search_url": {"description": "The saved search on LinkedIn, without the new-since-last-run filter.", "title": "Search Url", "type": "string"}, "lead_search": {"description": "`true` for a people search, `false` for a company search.", "examples": [true], "title": "Lead Search", "type": "boolean"}, "template_extraction_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The extraction this schedule was started from, when it still exists. Same id `GET /v1/extractions/{extraction_id}/` accepts.", "title": "Template Extraction Id"}, "last_execution_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the schedule last launched a run. Null before the first automatic run.", "title": "Last Execution At"}, "next_execution_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "When the next run is due. A paused schedule still reports the date it would have used.", "title": "Next Execution At"}, "runs": {"default": 0, "description": "Exports this schedule has already produced.", "examples": [3], "title": "Runs", "type": "integer"}, "leads": {"default": 0, "description": "Leads collected across those runs.", "examples": [120], "title": "Leads", "type": "integer"}, "destinations": {"description": "Automatic integrations that receive each run: those sending all exports, all recurring exports, this recurring export, or the folder its runs are filed in. People-only integrations are left out of a company search.", "items": {"$ref": "#/components/schemas/RecurringDestinationOut"}, "title": "Destinations", "type": "array"}}, "required": ["id", "name", "frequency", "paused", "search_url", "lead_search"], "title": "RecurringExportOut", "type": "object"}, "RecurringExportUpdateIn": {"description": "Fields omitted, or sent as null, are left unchanged.", "properties": {"name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Name of the schedule and of the template extraction. The next run is created with this name. Exports already produced keep theirs.", "examples": ["Weekly CTOs"], "title": "Name"}, "frequency": {"anyOf": [{"enum": ["daily", "weekly", "monthly"], "type": "string"}, {"type": "null"}], "description": "New cadence. The next run is recomputed from the last one, so it can move sooner.", "examples": ["daily"], "title": "Frequency"}, "paused": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "`true` stops future runs and keeps the schedule. `false` resumes it. Resuming an overdue schedule waits one full interval instead of firing immediately.", "examples": [true], "title": "Paused"}}, "title": "RecurringExportUpdateIn", "type": "object"}, "RecurringExportDeleteOut": {"description": "The schedule is stopped. Exports it already produced are kept.", "properties": {"id": {"description": "The schedule that was stopped.", "format": "uuid", "title": "Id", "type": "string"}, "deleted": {"const": true, "default": true, "description": "Always `true`. The schedule cannot be restored.", "title": "Deleted", "type": "boolean"}}, "required": ["id"], "title": "RecurringExportDeleteOut", "type": "object"}, "ExtractionCreateOut": {"description": "202 Accepted response for URL + profile-list extractions.\n\nOld wire shape uses ``extraction_id`` (not ``search_id``) on POSTs;\nGET endpoints continue to expose the same value as ``search_id``.\nSee evaboot_django/public_api/views/extraction.py:506 (URL),\nline 867 (profile_ids/upload).", "properties": {"success": {"default": true, "description": "Always `true` when the extraction was accepted.", "examples": [true], "title": "Success", "type": "boolean"}, "extraction_id": {"description": "Identifier of the new extraction. Poll `GET /v1/extractions/{extraction_id}/` with it to follow progress and collect the results; it is the same value the list endpoint returns as `search_id`.", "examples": ["ext-12345"], "title": "Extraction Id", "type": "string"}, "message": {"default": "", "description": "Human-readable confirmation that the job was queued.", "examples": ["Extraction job created and processing has begun"], "title": "Message", "type": "string"}, "status": {"default": "", "description": "Stage the job was in when it was accepted.", "examples": ["Scraping initiated"], "title": "Status", "type": "string"}, "count": {"default": 0, "description": "Number of leads or accounts submitted, when known upfront. It is `0` for a search or list URL, whose real size is only known once Sales Navigator has been paged through.", "examples": [3], "title": "Count", "type": "integer"}}, "required": ["extraction_id"], "title": "ExtractionCreateOut", "type": "object"}, "UrlExtractionCreateIn": {"properties": {"list_category": {"anyOf": [{"enum": ["all", "changed_jobs", "posted_on_linkedin"], "type": "string"}, {"type": "null"}], "description": "Optional list tab: changed_jobs selects leads who changed jobs in the past 90 days; posted_on_linkedin selects leads who posted on LinkedIn in the past 30 days; all selects the whole list. The two filtered categories are only supported on lead lists. Omit to preserve the URL filter. Conflicts are rejected.", "title": "List Category"}, "linkedin_url": {"description": "The Sales Navigator URL to extract. Accepts a people or company search URL, a saved search URL, or a lead or account list URL. Copy it straight from your browser's address bar; it must be a `linkedin.com/sales/...` URL.", "examples": ["https://www.linkedin.com/sales/search/people?query=(spellCorrectionEnabled%3Atrue%2CrecentSearchParam%3A(keywords%3ACEOs))", "https://www.linkedin.com/sales/lists/people/729433720595773845"], "title": "Linkedin Url", "type": "string"}, "search_name": {"description": "Your own name for this extraction. Shown in the Evaboot dashboard and returned by the list and detail endpoints, so use something you will recognize later.", "examples": ["Tech Startup CEOs"], "maxLength": 255, "title": "Search Name", "type": "string"}, "webhook_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional HTTPS URL to notify once the extraction finishes. It receives a POST carrying the same results as `GET /v1/extractions/{extraction_id}/`, so you do not have to poll. Leave it out to poll instead.", "examples": ["https://myapp.com/webhook/extraction"], "title": "Webhook Url"}, "enrich_email": {"default": "all", "deprecated": true, "description": "Deprecated and ignored: every lead extraction now finds and verifies a professional email for every lead, and each lead costs 1 credit with its email included. Still accepted so existing integrations keep working.", "enum": ["none", "matching", "all"], "examples": ["all"], "title": "Enrich Email", "type": "string"}}, "required": ["linkedin_url", "search_name"], "title": "UrlExtractionCreateIn", "type": "object"}, "SingleExtractionOut": {"description": "200 OK response for single-profile extraction.\n\nLike the other POST endpoints, the legacy wire format uses\n``extraction_id`` rather than ``search_id``. See\nevaboot_django/public_api/views/extraction.py:1350.", "properties": {"success": {"default": true, "description": "Always `true` when the profile was extracted.", "examples": [true], "title": "Success", "type": "boolean"}, "extraction_id": {"description": "Identifier of the extraction that produced this record. Use it with `GET /v1/extractions/{extraction_id}/` to fetch the same result again later.", "examples": ["single-ext-12345"], "title": "Extraction Id", "type": "string"}, "prospect": {"additionalProperties": true, "default": {}, "description": "The extracted record, as human-readable column names mapped to values: identity, role and tenure, company details, and the email address plus its verification status when enrichment was requested. Which columns are present depends on whether a lead or an account was extracted. Empty if nothing could be extracted.", "examples": [{"Company Name": "TechCorp Inc", "Current Job": "Senior Software Engineer", "Email": "alex.johnson@techcorp.com", "Email Status": "safe", "Full Name": "Alex Johnson"}], "title": "Prospect", "type": "object"}}, "required": ["extraction_id"], "title": "SingleExtractionOut", "type": "object"}, "SingleExtractionCreateIn": {"properties": {"profile_id": {"description": "The lead or account to extract, as a Sales Navigator URL (`linkedin.com/sales/lead/...`) or as a bare Sales Navigator id. Public `linkedin.com/in/...` profile URLs are not accepted.", "examples": ["ACwAAABcYZ8B", "https://www.linkedin.com/sales/lead/ACwAAABcYZ8B"], "title": "Profile Id", "type": "string"}, "enrich_email": {"default": "all", "deprecated": true, "description": "Deprecated and ignored: every lead extraction now finds and verifies a professional email for every lead, and each lead costs 1 credit with its email included. Still accepted so existing integrations keep working.", "enum": ["none", "matching", "all"], "examples": ["all"], "title": "Enrich Email", "type": "string"}}, "required": ["profile_id"], "title": "SingleExtractionCreateIn", "type": "object"}, "ProfileExtractionCreateIn": {"properties": {"profile_ids": {"description": "The Sales Navigator leads or accounts to extract, as full URLs or as bare Sales Navigator ids. One batch must be either all leads or all accounts, and public `linkedin.com/in/...` profile URLs are not accepted. Between 1 and 2500 entries.", "examples": [["https://www.linkedin.com/sales/lead/ACwAAABcYZ8B", "https://www.linkedin.com/sales/lead/ACwAAABdYZ9C", "ACwAAABeYZ8D"]], "items": {"type": "string"}, "maxItems": 2500, "minItems": 1, "title": "Profile Ids", "type": "array"}, "search_name": {"description": "Your own name for this extraction. Shown in the Evaboot dashboard and returned by the list and detail endpoints.", "examples": ["Target Executive Prospects"], "maxLength": 255, "title": "Search Name", "type": "string"}, "webhook_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional HTTPS URL to notify once the extraction finishes. It receives a POST carrying the same results as `GET /v1/extractions/{extraction_id}/`, so you do not have to poll.", "examples": ["https://myapp.com/webhook/extraction"], "title": "Webhook Url"}, "enrich_email": {"default": "all", "deprecated": true, "description": "Deprecated and ignored: every lead extraction now finds and verifies a professional email for every lead, and each lead costs 1 credit with its email included. Still accepted so existing integrations keep working.", "enum": ["none", "matching", "all"], "examples": ["all"], "title": "Enrich Email", "type": "string"}}, "required": ["profile_ids", "search_name"], "title": "ProfileExtractionCreateIn", "type": "object"}, "ExtractionListItemOut": {"properties": {"search_id": {"description": "Identifier of the extraction. Pass it to `GET /v1/extractions/{extraction_id}/` to fetch the results.", "examples": ["ext-12345"], "title": "Search Id", "type": "string"}, "search_name": {"default": "", "description": "The name you gave the extraction when you created it.", "examples": ["Tech Startup CEOs"], "title": "Search Name", "type": "string"}, "status": {"default": "", "description": "Where the extraction stands: `ACCEPTED` (queued), `SCHEDULED` (waiting for its start date), `EXECUTING` (running), `EXECUTED` (finished, results available), `PAUSED` (waiting for credits) or `FAILED`.", "examples": ["EXECUTED"], "title": "Status", "type": "string"}, "extraction_type": {"default": "", "description": "How the extraction was created: `SEARCH` (a search URL), `LIST` (a lead or account list URL), `UPLOAD` (a list of profiles) or `SINGLE` (one profile).", "examples": ["SEARCH"], "title": "Extraction Type", "type": "string"}, "total_prospects": {"default": 0, "description": "Number of leads or accounts Sales Navigator reported for this search before scraping. An estimate, so it can differ from the number of records finally returned.", "examples": [150], "title": "Total Prospects", "type": "integer"}, "search_date_created": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "When the extraction was created (UTC).", "examples": ["2023-01-01 12:00:00+00:00"], "title": "Search Date Created"}}, "required": ["search_id"], "title": "ExtractionListItemOut", "type": "object"}, "ExtractionDetailOut": {"properties": {"search_id": {"description": "Identifier of the extraction you requested.", "examples": ["ext-12345"], "title": "Search Id", "type": "string"}, "search_name": {"default": "", "description": "The name you gave the extraction when you created it.", "examples": ["Tech Startup CEOs"], "title": "Search Name", "type": "string"}, "status": {"default": "", "description": "Where the extraction stands. On this response it is `EXECUTED` when the results are complete, or `FAILED` / `PAUSED` when they are not.", "examples": ["EXECUTED"], "title": "Status", "type": "string"}, "extraction_type": {"default": "", "description": "How the extraction was created: `SEARCH`, `LIST`, `UPLOAD` or `SINGLE`.", "examples": ["SEARCH"], "title": "Extraction Type", "type": "string"}, "total_prospects": {"default": 0, "description": "Number of leads or accounts Sales Navigator reported before scraping. An estimate; use `total_count` for the number of records actually extracted.", "examples": [150], "title": "Total Prospects", "type": "integer"}, "progress": {"default": 0, "description": "Completion percentage, 0 to 100. `100` once the extraction has finished successfully.", "examples": [100], "title": "Progress", "type": "integer"}, "created_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "When the extraction was created (UTC).", "examples": ["2023-01-01 12:00:00+00:00"], "title": "Created At"}, "completed_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "When the extraction finished (UTC). `null` if it never finished.", "examples": ["2023-01-01 12:04:31+00:00"], "title": "Completed At"}, "failure_reason": {"default": "", "description": "Short machine-readable reason the extraction did not complete, for example `insufficient_credits`, `auth_error`, `quota_exceeded` or `invalid_urls`. Empty string when the extraction succeeded.", "examples": ["insufficient_credits"], "title": "Failure Reason", "type": "string"}, "prospects": {"default": [], "description": "The extracted records, each a mapping of human-readable column names to values: identity, role and tenure, company details, and the email address plus its verification status when enrichment was requested. Which columns are present depends on whether leads or accounts were extracted.", "examples": [[{"Company Name": "TechCorp Inc", "Current Job": "Senior Software Engineer", "Email": "alex.johnson@techcorp.com", "Email Status": "safe", "Full Name": "Alex Johnson"}]], "items": {"additionalProperties": true, "type": "object"}, "title": "Prospects", "type": "array"}, "start": {"default": 0, "description": "Zero-based index of the first record returned.", "examples": [0], "title": "Start", "type": "integer"}, "limit": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Page size that was applied, echoing the `limit` you sent. `null` when you did not page and every record was returned.", "examples": [100], "title": "Limit"}, "returned_count": {"default": 0, "description": "Number of records in `prospects` on this response.", "examples": [100], "title": "Returned Count", "type": "integer"}, "total_count": {"default": 0, "description": "Number of records this extraction produced in total, across all pages.", "examples": [143], "title": "Total Count", "type": "integer"}, "has_more": {"default": false, "description": "Whether records remain after this page. Request the next page with `start` = `start` + `returned_count`.", "examples": [true], "title": "Has More", "type": "boolean"}}, "required": ["search_id"], "title": "ExtractionDetailOut", "type": "object"}, "ExtractionInProgressOut": {"description": "202 response for in-progress extractions on detail GET.", "properties": {"search_id": {"description": "Identifier of the extraction you requested.", "examples": ["ext-12345"], "title": "Search Id", "type": "string"}, "search_name": {"default": "", "description": "The name you gave the extraction when you created it.", "examples": ["Tech Startup CEOs"], "title": "Search Name", "type": "string"}, "status": {"default": "", "description": "Where the extraction stands: `ACCEPTED` (queued), `SCHEDULED` (waiting for its start date) or `EXECUTING` (running).", "examples": ["EXECUTING"], "title": "Status", "type": "string"}, "progress": {"default": 0, "description": "Completion percentage, 0 to 100. Paging through Sales Navigator accounts for the first three quarters, fetching the individual profiles for the last quarter.", "examples": [45], "title": "Progress", "type": "integer"}, "extraction_type": {"default": "", "description": "How the extraction was created: `SEARCH`, `LIST`, `UPLOAD` or `SINGLE`.", "examples": ["SEARCH"], "title": "Extraction Type", "type": "string"}, "created_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "When the extraction was created (UTC).", "examples": ["2023-01-01 12:00:00+00:00"], "title": "Created At"}, "total_prospects": {"default": 0, "description": "Number of leads or accounts Sales Navigator reported for this search before scraping. An estimate.", "examples": [150], "title": "Total Prospects", "type": "integer"}}, "required": ["search_id"], "title": "ExtractionInProgressOut", "type": "object"}, "EmailFinderJobAcceptedOut": {"description": "POST response \u2014 accepted-and-queued. HTTP 202.\n\nMatches legacy ``EmailFinderListCreateView.create`` at\n``evaboot_django/public_api/views/email_finder.py:302-308``.\nBubble's workflow stores ``job_id`` (the Bubble-minted ID) and uses\nit for subsequent GET polling.", "properties": {"success": {"default": true, "description": "Always `true`; failures come back as an error response.", "examples": [true], "title": "Success", "type": "boolean"}, "job_id": {"description": "Identifier of the queued job. Use it with `GET /v1/email-finder/{job_id}/` to collect the results.", "examples": ["550e8400-e29b-41d4-a716-446655440000"], "title": "Job Id", "type": "string"}, "message": {"default": "Email finder job created and processing has begun", "description": "Human-readable confirmation that the job was queued.", "examples": ["Email finder job created and processing has begun"], "title": "Message", "type": "string"}}, "required": ["job_id"], "title": "EmailFinderJobAcceptedOut", "type": "object"}, "EmailFinderJobIn": {"description": "Bulk email-finder job request \u2014 matches legacy\n``EmailFinderJobSerializer`` (public_api/serializers/email_finder.py).", "properties": {"job_name": {"default": "", "description": "Your own label for the job, so you can recognize it later. Optional.", "examples": ["Tech Startup Email Hunt"], "title": "Job Name", "type": "string"}, "webhook_url": {"default": "", "description": "Optional HTTPS URL to notify when the job finishes. We send a POST carrying the same payload as `GET /v1/email-finder/{job_id}/`, so you can skip polling.", "examples": ["https://myapp.com/webhook/email-finder"], "title": "Webhook Url", "type": "string"}, "prospects": {"description": "The people to find emails for. Each entry needs a first and last name plus a company name or domain. Leave empty when sending `source`.", "items": {"$ref": "#/components/schemas/EmailFinderProspectIn"}, "title": "Prospects", "type": "array"}, "source": {"anyOf": [{"$ref": "#/components/schemas/LeadSourceIn"}, {"type": "null"}], "description": "Read the prospects from a connected integration instead of sending them: every lead with a name, a company and no email yet, up to `max_leads` read. Cannot be combined with `prospects`."}, "write_back": {"default": false, "description": "Write each result back onto the record its prospect's `source_ref` points to, once the job is paid for. Fills empty fields only and never creates a record.", "examples": [false], "title": "Write Back", "type": "boolean"}}, "title": "EmailFinderJobIn", "type": "object"}, "EmailFinderProspectIn": {"description": "One prospect inside a bulk email-finder job (Bubble's POST shape).", "properties": {"first_name": {"description": "First name of the prospect.", "examples": ["John"], "title": "First Name", "type": "string"}, "last_name": {"description": "Last name of the prospect.", "examples": ["Doe"], "title": "Last Name", "type": "string"}, "company_name": {"default": "", "description": "Name of the company the prospect works at. Supply this or `company_domain` for each prospect.", "examples": ["Example Corp"], "title": "Company Name", "type": "string"}, "company_domain": {"default": "", "description": "Web domain of the prospect's company, without a scheme or path. Improves accuracy when you already know it.", "examples": ["example.com"], "title": "Company Domain", "type": "string"}, "source_ref": {"default": "", "description": "Optional. The `source_ref` of a lead read from a connected integration. With `write_back` on, the result is written back to that record.", "examples": [""], "title": "Source Ref", "type": "string"}}, "required": ["first_name", "last_name"], "title": "EmailFinderProspectIn", "type": "object"}, "LeadSourceIn": {"properties": {"integration_id": {"description": "A connected integration, from `GET /v1/integrations/`.", "format": "uuid", "title": "Integration Id", "type": "string"}, "source_id": {"description": "A source of that integration, from `GET /v1/integrations/{id}/sources/`.", "examples": ["all"], "title": "Source Id", "type": "string"}, "max_leads": {"default": 2500, "description": "Most leads to read from the source. The job costs at most this many credits.", "examples": [2500], "maximum": 10000, "minimum": 1, "title": "Max Leads", "type": "integer"}}, "required": ["integration_id", "source_id"], "title": "LeadSourceIn", "type": "object"}, "EmailFinderJobSummaryOut": {"description": "One row of the job list: a job without its prospects. ``id`` is the\nBubble-minted ``bubble_job_id`` (NOT the Django UUID), per legacy behavior\nat ``evaboot_django/public_api/views/email_finder.py:410``.", "properties": {"id": {"description": "Identifier of the job, as returned when you created it.", "examples": ["dcbcdb01-42a8-4efb-91a7-ce6a9ba01afb"], "title": "Id", "type": "string"}, "status": {"description": "Job status: `pending`, `running`, `complete` or `failed`.", "examples": ["complete"], "title": "Status", "type": "string"}, "created_at": {"description": "When the job was created.", "examples": ["2023-01-01T12:00:00Z"], "title": "Created At", "type": "string"}, "updated_at": {"description": "When the job last changed.", "examples": ["2023-01-01T12:05:00Z"], "title": "Updated At", "type": "string"}, "progress": {"default": 0, "description": "Percentage of the job's prospects that have finished, from 0 to 100.", "examples": [100], "title": "Progress", "type": "integer"}, "prospect_count": {"description": "Number of prospects submitted.", "examples": [2], "title": "Prospect Count", "type": "integer"}, "error_message": {"default": "", "description": "Job-level failure message. Empty when the job itself did not fail; a single prospect failing is reported on that prospect.", "title": "Error Message", "type": "string"}, "job_type": {"default": "email_finder", "description": "Always `email_finder` for jobs created on this endpoint.", "examples": ["email_finder"], "title": "Job Type", "type": "string"}}, "required": ["id", "status", "created_at", "updated_at", "prospect_count"], "title": "EmailFinderJobSummaryOut", "type": "object"}, "EmailFinderOut": {"description": "Single email-finder response (matches old SingleEmailFinderCreateView).", "properties": {"success": {"default": true, "description": "`true` when the lookup ran, including when it ran and found nothing; `false` when the lookup itself errored.", "examples": [true], "title": "Success", "type": "boolean"}, "job_id": {"default": "", "description": "Reference for this single lookup. There is nothing to poll: the result is already in `prospect`.", "examples": ["550e8400-e29b-41d4-a716-446655440000"], "title": "Job Id", "type": "string"}, "prospect": {"$ref": "#/components/schemas/EmailFinderProspectOut", "description": "The person you asked about, with the email and its verdict."}}, "required": ["prospect"], "title": "EmailFinderOut", "type": "object"}, "EmailFinderProspectOut": {"properties": {"id": {"default": "", "description": "Identifier of this prospect within the job.", "examples": ["5371cd59-adc2-402f-af02-d40aee34f629"], "title": "Id", "type": "string"}, "first_name": {"default": "", "description": "First name as submitted.", "examples": ["John"], "title": "First Name", "type": "string"}, "last_name": {"default": "", "description": "Last name as submitted.", "examples": ["Doe"], "title": "Last Name", "type": "string"}, "full_name": {"default": "", "description": "First and last name joined, for convenience.", "examples": ["John Doe"], "title": "Full Name", "type": "string"}, "company_name": {"default": "", "description": "Company name as submitted.", "examples": ["Example Corp"], "title": "Company Name", "type": "string"}, "company_domain": {"default": "", "description": "Company domain as submitted.", "examples": ["example.com"], "title": "Company Domain", "type": "string"}, "found_email": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "The email address we found, or `null` when no address could be found for this prospect.", "examples": ["john.doe@example.com"], "title": "Found Email"}, "email_validity": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Deliverability verdict for `found_email`: `safe` (deliverable), `riskier` (accepts mail but less certain), `suspect` or `invalid`. `null` when no email was found.", "examples": ["safe"], "title": "Email Validity"}, "status": {"default": "", "description": "Outcome for this prospect: `pending` (queued), `processing` (being looked up), `complete` (finished, see `found_email`) or `failed` (no email found, or the lookup errored).", "examples": ["complete"], "title": "Status", "type": "string"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Why this prospect failed, or `null` when it did not fail.", "examples": ["Email not found"], "title": "Error Message"}}, "title": "EmailFinderProspectOut", "type": "object"}, "SingleEmailJobDeferredOut": {"description": "Single-lookup response when the lookup outlasts the deadline. HTTP 202.\n\nShared by ``/v1/email-finder/single/`` and ``/v1/email-validation/single/``.\nThe lookup keeps running and is billed as usual; the result is read from\nthe matching job-retrieval endpoint.", "properties": {"success": {"default": true, "description": "Always `true`; failures come back as an error response.", "examples": [true], "title": "Success", "type": "boolean"}, "job_id": {"description": "Identifier of the lookup. Poll `GET /v1/email-finder/{job_id}/` (or `GET /v1/email-validation/{job_id}/` for a verification) until it returns 200.", "examples": ["550e8400e29b41d4a716446655440000"], "title": "Job Id", "type": "string"}, "status": {"default": "running", "description": "`running` or `pending`: the lookup has not finished yet.", "examples": ["running"], "title": "Status", "type": "string"}, "message": {"default": "Still running: poll the job endpoint for the result", "description": "Human-readable explanation of the 202.", "title": "Message", "type": "string"}}, "required": ["job_id"], "title": "SingleEmailJobDeferredOut", "type": "object"}, "EmailFinderIn": {"properties": {"first_name": {"description": "First name of the person whose email you are looking for.", "examples": ["John"], "title": "First Name", "type": "string"}, "last_name": {"description": "Last name of the person whose email you are looking for.", "examples": ["Doe"], "title": "Last Name", "type": "string"}, "company_name": {"default": "", "description": "Name of the company the person works at. Supply this or `company_domain` \u2014 the lookup needs at least one of them, and sending both gives the best hit rate.", "examples": ["Example Corp"], "title": "Company Name", "type": "string"}, "company_domain": {"default": "", "description": "Web domain of the company, without a scheme or path. The most accurate way to identify the company; supply this or `company_name`.", "examples": ["example.com"], "title": "Company Domain", "type": "string"}}, "required": ["first_name", "last_name"], "title": "EmailFinderIn", "type": "object"}, "EmailFinderJobOut": {"description": "Bulk job response (completed) \u2014 matches legacy\n``EmailFinderJobDetailSerializer``.", "properties": {"id": {"description": "Identifier of the job, as returned when you created it.", "examples": ["dcbcdb01-42a8-4efb-91a7-ce6a9ba01afb"], "title": "Id", "type": "string"}, "status": {"description": "Job status: `pending`, `running`, `complete` or `failed`.", "examples": ["complete"], "title": "Status", "type": "string"}, "created_at": {"description": "When the job was created.", "examples": ["2023-01-01T12:00:00Z"], "title": "Created At", "type": "string"}, "updated_at": {"description": "When the job last changed.", "examples": ["2023-01-01T12:05:00Z"], "title": "Updated At", "type": "string"}, "progress": {"default": 0, "description": "Percentage of the job's prospects that have finished, from 0 to 100.", "examples": [100], "title": "Progress", "type": "integer"}, "prospect_count": {"description": "Number of prospects submitted.", "examples": [2], "title": "Prospect Count", "type": "integer"}, "error_message": {"default": "", "description": "Job-level failure message. Empty when the job itself did not fail; a single prospect failing is reported on that prospect.", "title": "Error Message", "type": "string"}, "job_type": {"default": "email_finder", "description": "Always `email_finder` for jobs created on this endpoint.", "examples": ["email_finder"], "title": "Job Type", "type": "string"}, "prospects": {"description": "One result per prospect submitted, in the order received.", "items": {"$ref": "#/components/schemas/EmailFinderProspectOut"}, "title": "Prospects", "type": "array"}, "write_back": {"description": "One entry per integration the results are written back to. Empty unless the job was created with `write_back`.", "items": {"$ref": "#/components/schemas/WriteBackOut"}, "title": "Write Back", "type": "array"}}, "required": ["id", "status", "created_at", "updated_at", "prospect_count", "prospects"], "title": "EmailFinderJobOut", "type": "object"}, "WriteBackCountsOut": {"properties": {"updated": {"default": 0, "description": "Records that received the result.", "title": "Updated", "type": "integer"}, "skipped": {"additionalProperties": {"type": "integer"}, "description": "Records left unchanged, by reason: `has_email`, `has_status`, `email_changed`, `record_missing`, `no_email`, `email_status`, `duplicate`.", "title": "Skipped", "type": "object"}, "failed": {"default": 0, "description": "Records the integration refused.", "title": "Failed", "type": "integer"}}, "title": "WriteBackCountsOut", "type": "object"}, "WriteBackOut": {"properties": {"integration_id": {"description": "The integration written to.", "title": "Integration Id", "type": "string"}, "delivery_id": {"description": "Identifier of this write-back, for support.", "title": "Delivery Id", "type": "string"}, "status": {"description": "`running`, `completed` or `failed`.", "examples": ["completed"], "title": "Status", "type": "string"}, "error": {"default": "", "description": "Why it failed, when it did.", "title": "Error", "type": "string"}, "counts": {"anyOf": [{"$ref": "#/components/schemas/WriteBackCountsOut"}, {"type": "null"}], "description": "What happened to the records, once known."}}, "required": ["integration_id", "delivery_id", "status"], "title": "WriteBackOut", "type": "object"}, "EmailFinderJobInProgressOut": {"description": "GET response while job is pending or running. HTTP 202 + limited\nfields, matches legacy\n``evaboot_django/public_api/views/email_finder.py:399-406``.", "properties": {"id": {"description": "Identifier of the job.", "examples": ["550e8400-e29b-41d4-a716-446655440000"], "title": "Id", "type": "string"}, "status": {"description": "`pending` while the job is queued, `running` once it started.", "examples": ["running"], "title": "Status", "type": "string"}, "progress": {"default": 0, "description": "Percentage of the job's prospects that have finished, from 0 to 100.", "examples": [45], "title": "Progress", "type": "integer"}, "created_at": {"description": "When the job was created.", "examples": ["2023-01-01T12:00:00Z"], "title": "Created At", "type": "string"}, "updated_at": {"description": "When the job last changed.", "examples": ["2023-01-01T12:01:00Z"], "title": "Updated At", "type": "string"}}, "required": ["id", "status", "created_at", "updated_at"], "title": "EmailFinderJobInProgressOut", "type": "object"}, "EmailValidationJobAcceptedOut": {"description": "POST response \u2014 accepted-and-queued. HTTP 202.\nMatches legacy ``email_finder.py:457-461``.", "properties": {"success": {"default": true, "description": "True when the job was accepted.", "title": "Success", "type": "boolean"}, "job_id": {"description": "Identifier of the new job. Pass it to the job-retrieval endpoint to poll for results.", "examples": ["550e8400-e29b-41d4-a716-446655440000"], "title": "Job Id", "type": "string"}, "message": {"default": "Email validation job created and processing has begun", "description": "Human-readable confirmation that the job started.", "title": "Message", "type": "string"}}, "required": ["job_id"], "title": "EmailValidationJobAcceptedOut", "type": "object"}, "EmailValidationJobIn": {"description": "Bulk email-validation request. Same shape as the finder job\nminus the name/company fields. Matches legacy\n``EmailValidationJobSerializer``.", "properties": {"job_name": {"default": "", "description": "Your own label for the job, so you can recognize it later in the Evaboot dashboard.", "examples": ["Email List Validation"], "title": "Job Name", "type": "string"}, "webhook_url": {"default": "", "description": "Optional HTTPS URL to notify when the job finishes. It receives a POST carrying the same payload as the job-retrieval endpoint. Leave empty to poll instead.", "examples": ["https://myapp.com/webhook/email-validation"], "title": "Webhook Url", "type": "string"}, "prospects": {"description": "The addresses to verify, one entry per address. Leave empty when sending `source`.", "items": {"$ref": "#/components/schemas/EmailValidationProspectIn"}, "title": "Prospects", "type": "array"}, "source": {"anyOf": [{"$ref": "#/components/schemas/LeadSourceIn"}, {"type": "null"}], "description": "Read the addresses from a connected integration instead: every lead with an email, up to `max_leads` read. Cannot be combined with `prospects`."}, "write_back": {"default": false, "description": "Write each result back onto the record its prospect's `source_ref` points to, once the job is paid for. Fills empty fields only and never creates a record.", "examples": [false], "title": "Write Back", "type": "boolean"}}, "title": "EmailValidationJobIn", "type": "object"}, "EmailValidationProspectIn": {"description": "One prospect inside a bulk email-validation job \u2014 just the\naddress. Matches legacy ``EmailValidationProspectSerializer``.", "properties": {"email": {"description": "The email address to verify.", "examples": ["john.doe@example.com"], "title": "Email", "type": "string"}, "source_ref": {"default": "", "description": "Optional. The `source_ref` of a lead read from a connected integration. With `write_back` on, the result is written back to that record.", "examples": [""], "title": "Source Ref", "type": "string"}}, "required": ["email"], "title": "EmailValidationProspectIn", "type": "object"}, "EmailValidationJobSummaryOut": {"description": "One row of the job list: a job without its prospects. ``id`` is the\nbubble_job_id.", "properties": {"id": {"description": "Identifier of the job, as returned when you created it.", "examples": ["550e8400-e29b-41d4-a716-446655440000"], "title": "Id", "type": "string"}, "status": {"description": "Job status: `pending`, `running`, `complete` or `failed`.", "examples": ["complete"], "title": "Status", "type": "string"}, "created_at": {"description": "When the job was created.", "examples": ["2023-01-01T12:00:00Z"], "title": "Created At", "type": "string"}, "updated_at": {"description": "When the job last changed.", "examples": ["2023-01-01T12:05:00Z"], "title": "Updated At", "type": "string"}, "progress": {"default": 0, "description": "Percentage of addresses processed, from 0 to 100.", "examples": [100], "title": "Progress", "type": "integer"}, "prospect_count": {"description": "Number of addresses submitted.", "examples": [2], "title": "Prospect Count", "type": "integer"}, "error_message": {"default": "", "description": "Why the job failed. Empty when it completed normally.", "title": "Error Message", "type": "string"}, "job_type": {"default": "email_validation", "description": "Always `email_validation` for jobs created here.", "examples": ["email_validation"], "title": "Job Type", "type": "string"}}, "required": ["id", "status", "created_at", "updated_at", "prospect_count"], "title": "EmailValidationJobSummaryOut", "type": "object"}, "EmailValidationOut": {"description": "Single email-validation response (matches old SingleEmailValidationCreateView).", "properties": {"success": {"default": true, "description": "True when a verdict was reached, false when verification failed.", "title": "Success", "type": "boolean"}, "job_id": {"default": "", "description": "Reference for this verification, useful when correlating it with your own logs. Nothing is queued, so there is no job to poll.", "examples": ["dcbcdb01-42a8-4efb-91a7-ce6a9ba01afb"], "title": "Job Id", "type": "string"}, "prospect": {"$ref": "#/components/schemas/EmailValidationProspectOut", "description": "The verification result for the submitted address."}}, "required": ["prospect"], "title": "EmailValidationOut", "type": "object"}, "EmailValidationProspectOut": {"properties": {"email": {"default": "", "description": "The email address that was verified.", "examples": ["john.doe@example.com"], "title": "Email", "type": "string"}, "email_validity": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Deliverability verdict: `safe` (deliverable), `riskier` (deliverable but lower confidence), `suspect` (could not be confirmed) or `invalid` (undeliverable). Null when verification did not complete.", "examples": ["safe"], "title": "Email Validity"}, "status": {"default": "", "description": "Whether verification ran: `complete` when a verdict was reached, `failed` when it could not be.", "examples": ["complete"], "title": "Status", "type": "string"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Why verification failed. Null when it succeeded.", "examples": ["Validation error"], "title": "Error Message"}}, "title": "EmailValidationProspectOut", "type": "object"}, "EmailValidationIn": {"properties": {"email": {"description": "The email address to verify.", "examples": ["john.doe@example.com"], "title": "Email", "type": "string"}}, "required": ["email"], "title": "EmailValidationIn", "type": "object"}, "EmailValidationJobOut": {"description": "Bulk job response (completed). ``id`` is the bubble_job_id.", "properties": {"id": {"description": "Identifier of the job.", "examples": ["550e8400-e29b-41d4-a716-446655440000"], "title": "Id", "type": "string"}, "status": {"description": "`complete` when every address has been processed, `failed` when the job could not finish.", "examples": ["complete"], "title": "Status", "type": "string"}, "created_at": {"description": "When the job was created.", "examples": ["2023-01-01T12:00:00Z"], "title": "Created At", "type": "string"}, "updated_at": {"description": "When the job last changed.", "examples": ["2023-01-01T12:05:00Z"], "title": "Updated At", "type": "string"}, "progress": {"default": 0, "description": "Percentage of addresses processed, from 0 to 100.", "examples": [100], "title": "Progress", "type": "integer"}, "error_message": {"default": "", "description": "Why the job failed. Empty when it completed normally.", "title": "Error Message", "type": "string"}, "prospects": {"description": "One verification result per submitted address.", "items": {"$ref": "#/components/schemas/EmailValidationJobProspectOut"}, "title": "Prospects", "type": "array"}, "job_type": {"default": "email_validation", "description": "Always `email_validation` for jobs created here.", "examples": ["email_validation"], "title": "Job Type", "type": "string"}, "write_back": {"description": "One entry per integration the statuses are written back to. Empty unless the job was created with `write_back`.", "items": {"$ref": "#/components/schemas/WriteBackOut"}, "title": "Write Back", "type": "array"}}, "required": ["id", "status", "created_at", "updated_at", "prospects"], "title": "EmailValidationJobOut", "type": "object"}, "EmailValidationJobProspectOut": {"properties": {"id": {"default": "", "description": "Identifier of this address within the job.", "examples": ["123e4567-e89b-12d3-a456-426614174000"], "title": "Id", "type": "string"}, "email": {"default": "", "description": "The email address that was submitted for verification.", "examples": ["john.doe@example.com"], "title": "Email", "type": "string"}, "email_validity": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Deliverability verdict: `safe` (deliverable), `riskier` (deliverable but lower confidence), `suspect` (could not be confirmed) or `invalid` (undeliverable). Null when verification did not complete.", "examples": ["safe"], "title": "Email Validity"}, "status": {"default": "", "description": "Per-address progress: `pending`, `processing`, `complete` once a verdict was reached, or `failed` when verification could not run.", "examples": ["complete"], "title": "Status", "type": "string"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Why this address could not be verified. Null when it succeeded.", "examples": ["Invalid email domain"], "title": "Error Message"}}, "title": "EmailValidationJobProspectOut", "type": "object"}, "EmailValidationJobInProgressOut": {"description": "GET response while job is pending or running. HTTP 202 +\nlimited fields, matches legacy.", "properties": {"id": {"description": "Identifier of the job.", "examples": ["550e8400-e29b-41d4-a716-446655440000"], "title": "Id", "type": "string"}, "status": {"description": "`pending` while the job is queued, `running` while addresses are being verified.", "examples": ["running"], "title": "Status", "type": "string"}, "progress": {"default": 0, "description": "Percentage of addresses processed so far, from 0 to 100.", "examples": [45], "title": "Progress", "type": "integer"}, "created_at": {"description": "When the job was created.", "examples": ["2023-01-01T12:00:00Z"], "title": "Created At", "type": "string"}, "updated_at": {"description": "When the job last changed.", "examples": ["2023-01-01T12:01:00Z"], "title": "Updated At", "type": "string"}}, "required": ["id", "status", "created_at", "updated_at"], "title": "EmailValidationJobInProgressOut", "type": "object"}, "QuotaInfo": {"properties": {"daily_limit": {"default": 0, "description": "Total profiles you may extract per day, summed across your valid Sales Navigator accounts.", "examples": [2500], "title": "Daily Limit", "type": "integer"}, "used_today": {"default": 0, "description": "Profiles extracted in the last 24 hours, summed across your valid Sales Navigator accounts.", "examples": [250], "title": "Used Today", "type": "integer"}, "remaining": {"default": 0, "description": "Profiles you can still extract today, summed across your valid Sales Navigator accounts. A single extraction cannot exceed the `remaining` of one account, so check `salesnavs` before launching a large job.", "examples": [2250], "title": "Remaining", "type": "integer"}, "has_valid_salesnav": {"default": false, "description": "Whether at least one usable Sales Navigator account is connected. When `false` no extraction can be launched, whatever your credit balance. Sign in to this same Evaboot account, open a Sales Navigator search in Chrome with the Evaboot extension installed, and click Export with Evaboot. That writes the cookies.", "examples": [true], "title": "Has Valid Salesnav", "type": "boolean"}, "credits": {"default": 0.0, "description": "Credits available to spend on API operations. An extraction costs 1 credit per lead, its email included; Email Finder costs 1 credit per email found; email validation costs 1 credit per address checked.", "examples": [1500.0], "title": "Credits", "type": "number"}, "salesnavs": {"default": [], "description": "Every Sales Navigator account connected to your Evaboot account, valid or not, with its own daily limit and usage.", "items": {"$ref": "#/components/schemas/SalesNavInfo"}, "title": "Salesnavs", "type": "array"}}, "title": "QuotaInfo", "type": "object"}, "QuotaOut": {"properties": {"success": {"default": true, "description": "`true` when the quota was read successfully.", "examples": [true], "title": "Success", "type": "boolean"}, "quota": {"$ref": "#/components/schemas/QuotaInfo", "description": "Your current daily extraction quota and credit balance."}}, "required": ["quota"], "title": "QuotaOut", "type": "object"}, "SalesNavInfo": {"properties": {"id": {"description": "Identifier of the connected Sales Navigator account.", "examples": ["7f4c1e2a-9b3d-4a51-8c6e-2f0d5b7a1c34"], "title": "Id", "type": "string"}, "status": {"description": "Whether this Sales Navigator account can currently be used to extract: `valid` when its session is still good, `invalid` when its cookies are missing or no longer accepted. Refresh them in the Evaboot Chrome extension: sign in to this same Evaboot account, open a Sales Navigator search, and click Export with Evaboot. An `invalid` account contributes nothing to your daily limit.", "examples": ["valid"], "title": "Status", "type": "string"}, "daily_limit": {"default": 0, "description": "Profiles this Sales Navigator account may extract per day. `0` when the account is `invalid`.", "examples": [2500], "title": "Daily Limit", "type": "integer"}, "used_today": {"default": 0, "description": "Profiles already extracted on this Sales Navigator account in the last 24 hours.", "examples": [250], "title": "Used Today", "type": "integer"}, "remaining": {"default": 0, "description": "Profiles this Sales Navigator account can still extract in the next launch, before its daily limit is reached.", "examples": [2250], "title": "Remaining", "type": "integer"}}, "required": ["id", "status"], "title": "SalesNavInfo", "type": "object"}, "LinkedInSessionOut": {"properties": {"success": {"default": true, "description": "`true` when the cookies were stored.", "examples": [true], "title": "Success", "type": "boolean"}, "linkedin_id": {"description": "Sales Navigator member id the cookies belong to.", "examples": ["ACwAAAExample"], "title": "Linkedin Id", "type": "string"}}, "required": ["linkedin_id"], "title": "LinkedInSessionOut", "type": "object"}, "LinkedInSessionIn": {"properties": {"li_a": {"description": "The `li_a` cookie from the signed-in LinkedIn browser. Copy it from Chrome DevTools, Application, Cookies, https://www.linkedin.com.", "minLength": 1, "title": "Li A", "type": "string"}, "li_at": {"description": "The `li_at` cookie from the same browser, copied the same way.", "minLength": 1, "title": "Li At", "type": "string"}}, "required": ["li_a", "li_at"], "title": "LinkedInSessionIn", "type": "object"}, "SearchBuilderOut": {"properties": {"success": {"default": true, "description": "Always `true` on a successful response. Failed requests return an error object instead.", "examples": [true], "title": "Success", "type": "boolean"}, "url": {"description": "The generated Sales Navigator search URL. Open it in Sales Navigator to review the results, or send it to the URL extraction endpoint to extract the leads it matches.", "examples": ["https://www.linkedin.com/sales/search/people?query=(filters%3AList((type%3ASENIORITY_LEVEL%2Cvalues%3AList((id%3A310%2Ctext%3ACXO%2CselectionType%3AINCLUDED)))))"], "title": "Url", "type": "string"}, "filters_used": {"additionalProperties": true, "description": "Summary of the filters that were applied, so you can check the description was understood before running an extraction. Keyed by filter type, each value a list of the labels Sales Navigator shows; excluded values are prefixed with `NOT `, `ANNUAL_REVENUE` reads as a range such as `10M-50M USD`, and a `keywords` key appears when free-text keywords were used.", "examples": [{"COMPANY_HEADCOUNT": ["51-200"], "INDUSTRY": ["Software Development"], "REGION": ["United States"], "SENIORITY_LEVEL": ["CXO"]}], "title": "Filters Used", "type": "object"}}, "required": ["url", "filters_used"], "title": "SearchBuilderOut", "type": "object"}, "SearchBuilderIn": {"properties": {"description": {"description": "Plain-language description of the leads or accounts you want to find. Mention everything that matters (job titles, seniority, industry, company size, location, revenue) and it is mapped onto the matching Sales Navigator filters. Between 10 and 2000 characters.", "examples": ["CTOs and VPs of Engineering at SaaS companies in the US with 50-200 employees"], "maxLength": 2000, "minLength": 10, "title": "Description", "type": "string"}, "search_type": {"default": "LEAD", "description": "Which Sales Navigator search to build: `\"LEAD\"` for a people search, `\"ACCOUNT\"` for a company search.", "enum": ["LEAD", "ACCOUNT"], "examples": ["LEAD"], "title": "Search Type", "type": "string"}}, "required": ["description"], "title": "SearchBuilderIn", "type": "object"}}, "securitySchemes": {"PublicBearer": {"type": "http", "scheme": "bearer"}}}, "servers": [{"url": "https://api.evaboot.com", "description": "Production Server"}], "tags": [{"name": "LinkedIn Extraction", "description": "Operations for extracting profiles from LinkedIn"}, {"name": "Email Finder", "description": "Operations for finding email addresses"}, {"name": "Email Verifier", "description": "Operations for verifying email addresses"}, {"name": "Account", "description": "Account and quota management operations"}, {"name": "Search Builder", "description": "Generate Sales Navigator search URLs from natural language"}]}