Skip to content

Lusha API Documentation

Lusha provides a RESTful API that allows you to query a comprehensive dataset of business profiles and company information. It is designed for teams building prospecting, enrichment, automation, and analytics workflows that require accurate, continuously updated business data. The API supports both real-time and bulk use cases and is suitable for production environments. Use the Lusha API to search for new prospects, enrich existing records, react to real-world changes, and expand coverage using lookalike recommendations.

All API requests should be made over HTTPS (SSL), and the response bodies are delivered in JSON format.


Person

https://api.lusha.com/v2/person
▶ Common Use Cases
  • • Form enrichment
  • • CRM completion
  • • Outbound personalization

Company

https://api.lusha.com/v2/company
▶ Common Use Cases
  • • Account enrichment
  • • Routing, scoring, territory logic
  • • Market analysis & segmentation

Signals

https://api.lusha.com/v2/signals
▶ Common Use Cases
  • • Job change tracking
  • • Company updates signals
  • • News event alerts

Lookalikes

https://api.lusha.com/v2/recommendations
▶ Common Use Cases
  • • Market expansion
  • • Similar account discovery
  • • Prospect recommendations
Webhooks APINEW

Subscribe to real-time notifications when contacts change jobs or companies experience key business events.

View Documentation →

Data Source and Privacy

Please note that Lusha is a search platform, meaning the data provided is not created or directly managed by us. Instead, it is retrieved from publicly available sources and through contributions from trusted business partners.

For more information on how we collect, use, and handle business profiles, please refer to our Privacy Policy.


Authentication

API keys are required for all API and MCP requests and are tied to your Lusha account and plan. To access the Lusha API, you must authenticate your requests using your API key. This key is unique to your account and is used to identify your usage of the API. How to Authenticate:

When making an API call, include your API key in the api_key header of the request.

You can generate and retrieve your API key here. API keys should be stored securely and used only in server-side environments.


Rate Limiting

Lusha API enforces rate limiting to ensure fair usage and protect against excessive load.

  • General Rate Limit: You can make up to 25 requests per second to each API endpoint
  • Credit Usage API: Has a specific rate limit of 5 requests per minute

Note: Rate limits may vary based on your account type and subscription plan. If you're encountering rate limit issues frequently, please consult with your account manager or Lusha support team to discuss your specific needs.

Rate Limit Headers

To monitor your current rate limit status, check the HTTP response headers in your API calls:

HeaderDescription
x-rate-limit-dailyThe total number of requests allowed per day under your current plan
x-daily-requests-leftThe number of requests remaining in your daily quota
x-daily-usageThe number of requests you have made in the current daily period
x-rate-limit-hourlyThe total number of requests allowed per hour under your current plan
x-hourly-requests-leftThe number of requests remaining in your hourly quota
x-hourly-usageThe number of requests you have made in the current hourly period
x-rate-limit-minuteThe total number of requests allowed per minute under your current plan
x-minute-requests-leftThe number of requests remaining in your current minute window
x-minute-usageThe number of requests you have made in the current minute window

Notes on API Rate Limiting

  • If you exceed the rate limit, the API will return a 429 (Too Many Requests) error.
  • To ensure a smooth experience, respect the rate limits defined by your subscription tier.
  • Daily limits vary based on your billing plan — higher tiers have higher quotas.
  • You can programmatically track your usage through these response headers:
    • X-RateLimit-Remaining-Daily
    • X-RateLimit-Reset-Daily
  • It is strongly recommended to implement logic that:
    • Monitors these headers
    • Pauses or retries requests accordingly
    • Helps avoid hitting the limit and ensures reliable operation

Error Codes

Lusha API uses standard HTTP response codes to indicate the status of your request. These codes help you understand whether the request was successful or if there was an issue.

Status CodeNameDescription
200OKSuccessful request
400Bad RequestBadly formatted request
401UnauthorizedThe API key is invalid
402Payment RequiredYour account requires payment
403ForbiddenYour account is not active. Please reach out to support at support@lusha.com for assistance
403ForbiddenYour pricing version does not support requesting individual datapoints [revealEmails, revealPhones]
404Not FoundThe requested endpoint was not found
412Precondition FailedThe request failed due to invalid syntax that was provided. Please make sure to send a full name field that contains a valid first & last name
429Too Many RequestsYou've reached your trial limit, please contact support for upgrade
429Too Many RequestsDaily API quota limit exceeded. Limit X calls per day
429Too Many RequestsHourly API rate limit exceeded. Limit: X calls per hour. Reset in X seconds
451Unavailable For Legal ReasonsWe are unable to process this contact request due to our GDPR regulations
499Client Closed RequestRequest failed due to request timeout
5XXServer ErrorThere's a problem on Lusha's end

Error Response Format

In case of an error, the response body will contain details about the error:

{
  "error": {
    "code": 400,
    "message": "Invalid request parameters"
  }
}

Handling errors

  • Always ensure your API key is correct and valid

  • Pay attention to the specific error message and code to troubleshoot issues efficiently

  • Implement proper error handling and retry logic in your application

  • For 5XX errors, implement exponential backoff before retrying


Download OpenAPI description
Languages
Servers
Mock server
https://docs.lusha.com/_mock/apis/openapi
Production server
https://api.lusha.com

Enrichment

What is enrichment?:

Enrichment is the process of adding missing or updated data to existing contact or company records.

Use enrichment to:

  • Complete CRM records
  • Improve outbound accuracy and deliverability
  • Keep records current as people and companies change

Enrichment can be performed in real time or in bulk, depending on the endpoint and use case.

Available enrichment APIs

Person enrichment:

Company enrichment:

Operations

Search Single Contact

Request

Find and enrich a single contact using various search criteria. You can search by name, email, LinkedIn URL, or company information.

Endpoint
GET https://api.lusha.com/v2/person
Search Requirements

You must provide either:

  • email OR
  • linkedinUrl OR
  • firstName AND lastName AND (companyName OR companyDomain)
Notes:
  • Provide as much information as possible for better results
  • Use refreshJobInfo=true to get the latest employment data
  • Use filterBy parameter to specify what contact details you need
  • Include the signals parameter to retriever contact signals (If no signals data is found for the specified period, the signals object will be empty but still present in the response.)
    • When requesting signals, you can optionally specify a start date using signalsStartDate.
    • Signals data is optional. If you don't include the signals parameter, no signals data will be returned.

⚠️ Important Notice - Unified Credits Plan Required

ParameterRequirement
revealEmails and revealPhonesOnly available to customers on the Unified Credits pricing plan
Plan RestrictionAttempting to use these parameters on other plans will result in a 403 Unauthorized error
Default BehaviorWhen neither parameter is used, the API returns both email addresses and phone numbers, if available

Security
ApiKeyAuth
Query
firstNamestring

The first name of the person

Example: firstName=Dustin
lastNamestring

The last name of the person

Example: lastName=Moskovitz
companyNamestring

The name of the company the person works at

Example: companyName=Lusha
companyDomainstring

The domain name of the company

Example: companyDomain=lusha.com
emailstring(email)

The email address of the person

Example: email=dustin@lusha.com
linkedinUrlstring(url)

The LinkedIn URL of the person

Example: linkedinUrl=https://www.linkedin.com/in/dustin/
refreshJobInfoboolean

Set to true to refresh and update the job details for the person. This ensures that outdated job information is replaced with the most recent data.

Default false
Example: refreshJobInfo=true
filterBystring

Filters results based on specific contact details. Available options:

  • phoneNumbers: Only return contacts with phone numbers
  • emailAddresses: Only return contacts with email addresses

By default, results will include contacts with at least one contact detail.

Enum"phoneNumbers""emailAddresses"
revealEmailsboolean

Set revealEmails=true to retrieve only the email address of the contact.

Default true
Example: revealEmails=true
revealPhonesboolean

Set revealPhones=true to retrieve only the phone number of the contact.

Default true
Example: revealPhones=true
signalsArray of strings

Array of signal types to retrieve for the contact.

  • allSignals: All available signal types
  • promotion: Promotion signals
  • companyChange: Company change signals
Items Enum"allSignals""promotion""companyChange"
Example: signals=promotion
signalsStartDatestring(date)

Start date for signal retrieval in YYYY-MM-DD format. Defaults to 6 months ago if not specified.

Example: signalsStartDate=2025-03-01
partialProfileboolean

Search for a single contact with the option to receive a partial profile.

Default false
Example: partialProfile=true
curl -i -X GET \
  'https://docs.lusha.com/_mock/apis/openapi/v2/person?firstName=Dustin&lastName=Moskovitz&companyName=Lusha&companyDomain=lusha.com&email=dustin%40lusha.com&linkedinUrl=https%3A%2F%2Fwww.linkedin.com%2Fin%2Fdustin%2F&refreshJobInfo=true&filterBy=phoneNumbers&revealEmails=true&revealPhones=true&signals=promotion&signalsStartDate=2025-03-01&partialProfile=true' \
  -H 'api_key: YOUR_API_KEY_HERE'

Responses

Successfully found contact information

Bodyapplication/json
contactobject(ContactSingleResponse)required
contact.​errorobject or null(ContactError)required
contact.​error.​codenumberrequired

The code of the contact error

Example: 3
contact.​error.​namestringrequired

The name of the contact error

Example: "EMPTY_DATA"
contact.​error.​messagestringrequired

The message of the contact error

Example: "Could not find requested data"
contact.​isCreditChargedbooleanrequired

Indicates whether a credit charge was made for the contact

Example: true
contact.​dataobject(ContactWithCompany)
Response
application/json
{ "contact": { "error": null, "isCreditCharged": false, "data": {} } }

Search Multiple Contacts

Request

Enrich multiple contacts in a single request. This endpoint allows you to submit a list of contacts and receive enriched data for each one, including company information.

Endpoint:
POST https://api.lusha.com/v2/person
Notes
  • You can process up to 100 contacts per request.
  • At least one of email, linkedinUrl, or company/domain with fullName is required.

⚠️ Important Notice - Unified Credits Plan Required

ParameterRequirement
revealEmails and revealPhonesOnly available to customers on the Unified Credits pricing plan
Plan RestrictionAttempting to use these parameters on other plans will result in a 403 Unauthorized error
Default BehaviorWhen neither parameter is used, the API returns both email addresses and phone numbers, if available

Security
ApiKeyAuth
Bodyapplication/jsonrequired

The list of contacts to enrich

contactsArray of objects(ContactSearchBulk)required

This is a required parameter that should contain a list of contact objects. Each contact will be processed based on the provided contact details.

contacts[].​contactIdstringrequired

A unique sequential ID to associate with the contact object in the API response

Example: "1234"
contacts[].​fullNamestring

The full name of the person

Example: "Dustin Moskovitz"
contacts[].​locationstring

The raw location of the person

Example: "Singapore,Chicago"
contacts[].​linkedinUrlstring

The LinkedIn URL of the person

Example: "https://www.linkedin.com/in/dustin/"
contacts[].​emailstring

The email address of the person

Example: "dustin@lusha.com"
contacts[].​companiesArray of objects(Company)

Details of the company where the contact is currently employed (or previously employed if applicable)

metadataobject(Metadata)
curl -i -X POST \
  https://docs.lusha.com/_mock/apis/openapi/v2/person \
  -H 'Content-Type: application/json' \
  -H 'api_key: YOUR_API_KEY_HERE' \
  -d '{
    "contacts": [
      {
        "contactId": "1",
        "fullName": "John Doe",
        "email": "john@example.com",
        "companies": [
          {
            "name": "Example Corp",
            "domain": "example.com",
            "isCurrent": true
          }
        ]
      },
      {
        "contactId": "2",
        "linkedinUrl": "https://www.linkedin.com/in/carolinaportela/"
      }
    ],
    "metadata": {
      "revealEmails": true,
      "revealPhones": true,
      "signals": [
        "promotion",
        "companyChange"
      ],
      "signalsStartDate": "2025-03-01",
      "partialProfile": true
    }
  }'

Responses

The list of enriched contacts with their company details

Bodyapplication/json
contactsobjectrequired

The contacts of the bulk person output, keyed by contactId

contacts.​property name*object(ContactResponse)additional property
companiesobjectrequired

The companies of the bulk person output, keyed by companyId

companies.​property name*object(CompanyResponse)additional property
Response
application/json
{ "contacts": { "1": {}, "2": {} }, "companies": { "1586": {}, "33222678": {} } }

Search Single Company

Request

Find detailed information about a single company by using different paramaters.

Endpoint:
GET https://api.lusha.com/v2/company
Notes:
  • At least one of domain, company, or companyId is required.
Security
ApiKeyAuth
Query
domainstring

The domain name associated with the company

Example: domain=example.com
companystring

The name of the company

Example: company=Lusha
companyIdstring

A unique identifier for a Lusha company.

Example: companyId=1234567890
signalsArray of strings

Array of signal types to retrieve for the company.

  • allSignals: All available signal types
  • newsEvent: Company related events

See Signal Filters for complete list of available signals and their categories

Items Enum"allSignals""newsEvent""websiteTrafficIncrease""websiteTrafficDecrease""itSpendIncrease""itSpendDecrease""headcountIncrease1m""headcountDecrease1m""headcountIncrease3m""headcountDecrease3m"
Example: signals=itSpendIncrease
signalsStartDatestring(date)

Start date for signal retrieval in YYYY-MM-DD format. Defaults to 6 months ago if not specified.

Example: signalsStartDate=2025-03-01
partialCompanyboolean

Expand coverage with partial company profiles

Default true
Example: partialCompany=false
curl -i -X GET \
  'https://docs.lusha.com/_mock/apis/openapi/v2/company?domain=example.com&company=Lusha&companyId=1234567890&signals=itSpendIncrease&signalsStartDate=2025-03-01&partialCompany=false' \
  -H 'api_key: YOUR_API_KEY_HERE'

Responses

Company information retrieved successfully

Bodyapplication/json
dataobject(CompanySingleResponseData)
errorsobject(CompanyErrorResponse)
metaobject

Currently returns an empty value; this field should be deprecated in future releases.

Example: {}
Response
application/json
{ "data": { "id": 123, "description": "Lusha is the sales intelligence platform designed to help businesses get their next customers.", "domain": "lusha.com", "employees": "201 - 500", "founded": "August 1, 2011", "fqdn": "www.lusha.com", "logoUrl": "https://logo.lusha.co/logo.jpg", "name": "Lusha", "revenueRange": [], "mainIndustry": "Technology", "subIndustry": "Software", "social": {}, "address": "North America United States Boston 800 Boylston St , Suite 1410 , Boston, Massachusetts 02199, US Massachusetts US MA -71.05976867675781,42.358428955078125 ", "location": {}, "categories": [], "industryPrimaryGroupDetails": {}, "website": "https://lusha.com", "specialities": [], "funding": {}, "intent": {}, "technologies": [] }, "errors": { "message": "Something went wrong" }, "meta": {} }

Search Multiple Companies

Request

Search for multiple companies in a single request. Provide a list of companies with identifiers like domain names or company IDs.

Endpoint:
POST https://api.lusha.com/bulk/company/v2
Notes:
  • At least one of domain, company, or companyId is required.
  • You can process up to 100 companies per request.
Security
ApiKeyAuth
Bodyapplication/jsonrequired
companiesArray of objects(CompanyBulkRequest)required

The list of companies to search

companies[].​idstringrequired

A unique sequential ID associated with each company. This ID is used to correlate the provided company object with the API response

Example: "1"
companies[].​domainstring

The domain name associated with the company

Example: "lusha.com"
companies[].​fqdnstring

The Fully Qualified Domain Name (FQDN) of the company.

companies[].​namestring

The name of the company

Example: "Lusha"
companies[].​companyIdstring

A unique identifier for a Lusha company. Note: Values may be removed or merged. No management system exists to log historical changes for companyId. This field is intended for deprecation in the future.

Example: "1234567890"
signalsArray of strings

Array of signal types to retrieve for the companies.

  • allSignals: All available signal types
  • newsEvent: Company related events
  • surgeInHiring: Overall hiring activity increase

See Signal Filters for complete details on available signals and their categories

Items Enum"allSignals""newsEvent""websiteTrafficIncrease""websiteTrafficDecrease""itSpendIncrease""itSpendDecrease""headcountIncrease1m""headcountDecrease1m""headcountIncrease3m""headcountDecrease3m"
Example: ["newsEvent","surgeInHiringByLocation"]
signalsStartDatestring(date)

Start date for signal retrieval in YYYY-MM-DD format. Defaults to 6 months ago if not specified.

Example: "2025-03-01"
partialCompanyboolean

Expand coverage with partial company profiles

Default true
Example: false
curl -i -X POST \
  https://docs.lusha.com/_mock/apis/openapi/v2/company \
  -H 'Content-Type: application/json' \
  -H 'api_key: YOUR_API_KEY_HERE' \
  -d '{
    "companies": [
      {
        "id": "1",
        "name": "Lusha"
      },
      {
        "id": "2",
        "domain": "google.com"
      }
    ]
  }'

Responses

Bulk company search results

Bodyapplication/json
property name*object(CompanyBulkResponse)additional property
Response
application/json
{ "1": { "id": 33222678, "lushaCompanyId": "16303253", "name": "Lusha", "companySize": [], "fqdn": "www.lusha.com", "founded": "2016", "description": "Lusha is the leader in Sales Streaming – a new sales paradigm that streams top leads straight to salespeople and handles all the outreach, so they can escape the lead grind and just sell.\n\nLusha's Sales Streaming Platform is built around Sales Playlists that continuously fill up with their ideal prospects – think \"Spotify for sales.\" With AI doing the heavy lifting, Lusha uncovers great-fit leads salespeople never knew existed and executes tailored, perfectly timed cadences that get meetings booked. And the more you use Lusha, the smarter it gets.\n\nWith Sales Streaming, salespeople spend most of their time face-to-face with relevant prospects, driving 4-6X more business.", "logoUrl": "https://logo.lusha.co/brightdata/year=2024/month=05/day=03/j_lvq47h0g13te1b3wpu.e7b0795e7affc9953dadd43e6fce99a2c5260043.file_lvq4cfwv17kcb9m4ej.logo_cached.jpg", "industryPrimaryGroupDetails": {}, "linkedin": "https://www.linkedin.com/company/lushadata", "mainIndustry": "Technology, Information & Media", "subIndustry": "Software Development", "city": "Boston", "state": "Massachusetts", "country": "United States", "countryIso2": "US", "continent": "North America", "rawLocation": "800 Boylston St; Suite 1410; Boston, Massachusetts 02199, US", "crunchbase": "https://www.crunchbase.com/organization/lusha", "specialities": [], "funding": {}, "intent": {} }, "2": { "id": 1441, "lushaCompanyId": "10117615", "name": "Google", "companySize": [], "revenueRange": [], "fqdn": "www.google.com", "description": "A problem isn't truly solved until it's solved for all. Googlers build products that help create opportunities for everyone, whether down the street or across the globe. Bring your insight, imagination and a healthy disregard for the impossible. Bring everything that makes you unique. Together, we can build for everyone.\n\nCheck out our career opportunities at goo.gle/3DLEokh", "logoUrl": "https://logo.lusha.co/coresignal/202405/c/82/c822c1b63853ed273b89687ac505f9fa", "industryPrimaryGroupDetails": {}, "linkedin": "https://www.linkedin.com/company/google", "mainIndustry": "Technology, Information & Media", "subIndustry": "Software Development", "city": "Mountain View", "state": "California", "country": "United States", "countryIso2": "US", "continent": "North America", "rawLocation": "1600 Amphitheatre Parkway; Mountain View, CA 94043, US", "crunchbase": "https://www.crunchbase.com/organization/g-pay", "specialities": [], "intent": {} } }

Prospecting - Search & Enrich

With Lusha's Prospecting API, you can query Lusha's extensive database based on specific criteria (such as job title, seniority, location, and more) to retrieve detailed contact and company information.

The Prospecting API is designed to help you generate new records (contacts or companies) for your CRM system, using filters that align with your Ideal Customer Profile (ICP).

This process involves three main steps:

StepAPIDescription
1Filters APIApply filters to refine your search (Check available filters under Contact and Company Filters)
2Search APIQuery Contacts or Companies using the available filters
3Enrich APIGet full details of Contacts and Companies from the search results
Operations

Contact Filters

Available filters for contact searches

Operations

Company Filters

Available filters for company searches

Operations

Signals

With Lusha’s Signals API, you can enrich your contacts and companies with timely insights that highlight key account and prospect changes. Signals help you identify moments of opportunity - from job moves and promotions to company growth and new initiatives - so you can engage prospects and customers at exactly the right time. Easily integrate signal data into enrichment flows, CRM systems, or automation workflows to keep pipelines and customer records always up to date.

Operations

Lookalikes

Lusha's Lookalikes API helps you discover similar contacts and companies based on your existing data. Get AI-powered suggestions for new prospects that match your ideal customer profile.

Contact Lookalikes - Find similar contacts based on role, seniority, and industry patterns.

Company Lookalikes- Discover companies with similar firmographics and characteristics.

Operations

Webhooks

Subscribe to real-time notifications when contacts change jobs or companies experience key business events.

Webhooks deliver HTTP POST requests to your endpoints when signals occur - from promotions and job changes to company growth.

For a full list of available signals, refer to Signal Options.


Key Features:

  • Real-time contact & company signal notifications
  • Bulk subscription management (up to 25 items per request)
  • Secure delivery with HMAC-SHA256 signatures
  • Automatic URL verification during setup
  • Delivery monitoring with audit logs

Available Endpoints:

MethodEndpointPurpose
POST/api/subscriptionsCreate subscriptions (bulk supported)
GET/api/subscriptionsList all subscriptions
GET/api/subscriptions/{id}Get subscription by ID
PATCH/api/subscriptions/{id}Update subscription
POST/api/subscriptions/deleteDelete subscriptions (bulk supported)
POST/api/subscriptions/{id}/testTest subscription delivery
GET/api/audit-logsGet webhook delivery logs
GET/api/audit-logs/statsGet delivery statistics
GET/api/account/secretGet account webhook secret
POST/api/account/secret/regenerateRegenerate account secret

Webhook Verification: When creating subscriptions, Lusha sends a GET request with a challenge parameter. Your endpoint must return {"challenge": "value"} with HTTP 200.


Rate Limits
OperationLimit
API Requests100 requests/minute per account
Create Subscriptions25 items per request
Delete Subscriptions25 items per request

Security & Verification

HTTPS Requirement:

  • Production webhook URLs must use HTTPS
  • HTTP URLs are not accepted

Webhook Verification:

When creating or updating a subscription, Lusha verifies your webhook URL by sending a GET request with a challenge query parameter.

Verification Request:

GET https://your-webhook-url.com?challenge=abc123xyz

Expected Response (200 OK):

{
  "challenge": "abc123xyz"
}

Requirements:

  • Return HTTP 200 status
  • Return Content-Type: application/json
  • Echo back the exact challenge value

Signature Verification:

All webhook deliveries include an X-Lusha-Signature header containing an HMAC-SHA256 signature. Verify this signature to ensure the request is from Lusha:

  1. Extract the X-Lusha-Signature and X-Lusha-Timestamp headers
  2. Concatenate: timestamp + "." + JSON.stringify(payload)
  3. Compute HMAC-SHA256 using your webhook secret
  4. Compare the computed signature with the received signature

Example (Node.js):

const crypto = require('crypto');

function verifySignature(payload, signature, timestamp, secret) {
  const signedPayload = `${timestamp}.${JSON.stringify(payload)}`;
  const expectedSignature = crypto
    .createHmac('sha256', secret)
    .update(signedPayload)
    .digest('hex');
  
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expectedSignature)
  );
}

Security Best Practice: Always verify webhook signatures to prevent spoofed requests.


Credits & Billing

Credit Charges:

  • Credits are charged when signals are detected and delivered to your webhook
  • The creditsCharged field in the webhook payload indicates how many credits were used
  • Credits are deducted from your account balance per signal type

No Duplicate Charges:

  • Each signal is delivered once and charged once
  • Webhook delivery retries do not incur additional charges

Error Response Format

All error responses follow this format:

{
  "statusCode": 400,
  "message": "Validation failed",
  "errors": ["entityType must be one of: contact, company"]
}
FieldTypeDescription
statusCodenumberHTTP status code
messagestringError message
errorsstring[]Detailed error messages (optional)

Operations

Account Management

Manage your account and monitor usage.

Use this endpoint to:

  • Monitor credit usage
  • Understand consumption patterns
  • Align API usage with plan limits
  • Support governance and production operations

Account-level insights are especially important for teams running Lusha at scale or across multiple systems.

Operations