v2.31.0
OAS 3.0.0

SalesQL Public API

What is SalesQL?

SalesQL is a B2B data enrichment platform designed to help sales and recruitment professionals discover verified business contact information in seconds. With a powerful combination of LinkedIn integration and real-time data processing, SalesQL enables users to build highly targeted lead lists, access work emails and phone numbers, and keep CRM data fresh and accurate.

About the SalesQL API

The SalesQL API allows you to bring the power of SalesQL's data enrichment capabilities into your own applications, workflows, or CRM systems.

Whether you're enriching inbound leads, syncing contact data in your CRM, or automating prospecting workflows, the SalesQL API is designed to help you scale your efforts with speed and precision.

Getting Access

API access is currently offered on paid plans.

To use the API, you need an active SalesQL account with API access enabled. You can find your personal API key in your SalesQL Dashboard under Settings → API Access.

The API is authenticated via a secure token and comes with usage limits based on your plan.

Need Help?

If you need assistance or have questions about integrating the SalesQL API, our team is here to help.

📚 Visit our Help Center

Server:https://api-public.salesql.com/v1
Client Libraries

Create API Keys

Requests are authenticated using a Bearer token passed in the Authorization header. This is the only supported authentication method — query string tokens are not accepted. Generate your API key from the API Enrichment page in the SalesQL web app.

Steps

  1. Go to Settings → API Access in your SalesQL Dashboard
  2. Click "New API Key" to generate a new key
  3. Click to copy your API key and store it safely
Your API key grants full access to your account's enrichment capabilities.
Never share it publicly or commit it to source control.

Using Your API Key

Include the key in every request as a Bearer token:

curl --request GET \
  --url 'https://api-public.salesql.com/v1/persons/enrich/?linkedin_url=...' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Accept: application/json'
You can create multiple API keys to separate concerns, for example, one for each integration or team. Each key can be revoked independently from your dashboard, giving you fine-grained control over access.

Test Your API Key

Once you've generated your API key from the SalesQL Dashboard, test it with a simple call to the Enrichment API.

This test call uses a fixed LinkedIn URL and does not consume any credits.
It's completely safe for testing your setup.

Option 1: cURL

Open your terminal and run the following command, replacing YOUR_API_KEY with your actual key:

curl --request GET \
  --url 'https://api-public.salesql.com/v1/persons/enrich/?linkedin_url=https://linkedin.com/in/sandrocarsava' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Accept: application/json'

A successful response returns 200 OK with enriched profile data in JSON format.

Option 2: Browser

You can also test directly in your browser by passing the api_key as a query parameter:

https://api-public.salesql.com/v1/persons/enrich?linkedin_url=https://linkedin.com/in/sandrocarsava&api_key=YOUR_API_KEY
The api_key query parameter is a convenient way to test from a browser, but we recommend using the Authorization header in production integrations.

Pricing and Rate Limits

The SalesQL API uses a credit-based model tied to your subscription plan. Credits are shared across manual enrichments in the app, browser extension, and API calls.

Access and Credits

API access is included on Professional and Organization paid plans. Each successful enrichment consumes 1 credit the same as a manual enrichment inside the app.

For bulk requests, after the whole search is processed, credits are charged only for enriched persons that have at least one email or phone number.
Condition Credits consumed
API returns verified data ✅ 1 credit
Profile cannot be enriched ❌ No credit
You are charged only when enrichment returns billable data. No-result responses do not consume credits, but every request counts toward rate limits.
Test the API for free using https://linkedin.com/in/sandrocarsava — this profile never consumes credits.

See full pricing details at salesql.com/pricing.

Rate Limits

The API enforces per-account rate limits based on your subscription plan.

For bulk requests, each search counts as a group of multiple searches executed in parallel toward your rate limit. So 1 bulk with 100 results will count as 100 searches toward your rate limit.
Exceeding rate limits returns 429 Too Many Requests.
Implement a retry mechanism with exponential backoff to handle this gracefully.

Check your plan's rate limits at salesql.com/pricing.

Monitor Your Usage

Track credits and rate limit usage directly from your dashboard:

FAQs

📘 See our API Frequently Asked Questions for a deeper dive into credits and rate limits.

Get Credits Allowance

Retrieve current credits allowance information for the authenticated user.

Responses
  • application/json
    200
    Type: object ·

    Credits allowance information

    • credits
      Type: object ·
      required
    • reset_date
      Type: string | null
      required

      Date when credits will reset

  • application/json
    401
    Type: object

    Unauthorized - Authentication credentials were missing or invalid

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

  • application/json
    422
    Type: object

    Missing Parameters - The request is missing required parameters

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

  • application/json
    429
    Type: object

    Rate Limit Exceeded - Too many requests

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

Request Example for get/allowance
curl https://api-public.salesql.com/v1/allowance \
  --header 'Authorization: Bearer YOUR_API_KEY'
{
  "credits": {
    "emails_and_phones": 100,
    "verifications": 50
  },
  "reset_date": "2025-10-01T00:00:00Z"
}

Enrich Organization

Retrieve enriched data for an organization. You must provide one of the following search criteria:

  • linkedin_url — LinkedIn company URL (e.g. https://linkedin.com/company/linkedin)
  • organization_name — Exact or partial organization name
  • organization_domain — Website domain (e.g. salesql.com)
Query Parameters
  • linkedin_url
    Type: stringFormat: uri

    LinkedIn URL of the organization

  • organization_name
    Type: string

    Name of the organization

  • organization_domain
    Type: string

    Domain of the organization

Responses
  • application/json
    200
    Type: object

    Organization Enrichment Response

    • organization
      Type: object ·
  • application/json
    400
    Type: object

    Bad Request - The request was invalid or cannot be served

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

  • application/json
    401
    Type: object

    Unauthorized - Authentication credentials were missing or invalid

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

  • application/json
    404
    Type: object ·

    Not Found - The organization was not found

    • error
      Type: string
      required

      Error message declaring that the organization was not found

  • application/json
    422
    Type: object

    Missing Parameters - The request is missing required parameters

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

  • application/json
    429
    Type: object

    Rate Limit Exceeded - Too many requests

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

Request Example for get/organizations/enrich
curl 'https://api-public.salesql.com/v1/organizations/enrich?linkedin_url=&organization_name=&organization_domain=' \
  --header 'Authorization: Bearer YOUR_API_KEY'
{
  "organization": {
    "uuid": "f705200f-fe17-4960-a0a9-3aea1022844c",
    "name": "Clarosys",
    "website": "https://www.clarosys.com",
    "website_domain": "clarosys.com",
    "linkedin_url": "https://linkedin.com/company/clarosys",
    "logo": "https://cdn.example.com/company/clarosys.png",
    "founded_year": 2012,
    "number_of_employees": "1 - 10",
    "type": "self-owned"
  }
}

Bulk Enrich Organizations

Enrich up to 100 organizations in a single request.

Each query must contain at least one of:

  • linkedin_url — LinkedIn company URL
  • organization_name — Exact or partial organization name
  • organization_domain — Website domain (e.g. salesql.com)

Recommended matching strategy

- Parameters Notes
linkedin_url Highest accuracy, unique identifier
- organization_domain Reliable when LinkedIn URL is unavailable
- organization_name Use only when domain is unknown
Body
required
application/json
  • Type: array object[] 1…100

    List of organization search queries (max 100)

Responses
  • application/json
    200
    Type: array

    Bulk enrichment results

      • name
        Type: string
        required

        Name of the Organization

      • uuid
        Type: stringFormat: uuid
        required

        UUID of the Organization

      • founded_year
        Type: integer

        Year of the Organization's founding

      • industry
        Type: string ·

        Industry name

      • linkedin_url
        Type: stringFormat: uri

        LinkedIn URL of the Organization

      • location
        Type: object ·
      • logo
        Type: string | nullFormat: uri

        Logo image URL of the Organization

      • number_of_employees
        Type: string

        Number of employees of the Organization

      • type
        Type: string

        Organization type/kind

      • website
        Type: stringFormat: uri

        Website of the Organization

      • website_domain
        Type: string

        Domain of the Organization

  • application/json
    401
    Type: object

    Unauthorized - Authentication credentials were missing or invalid

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

  • application/json
    422
    Type: object

    Missing Parameters - The request is missing required parameters

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

  • application/json
    429
    Type: object

    Rate Limit Exceeded - Too many requests

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

Request Example for post/organizations/enrich/bulk
curl https://api-public.salesql.com/v1/organizations/enrich/bulk \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --data '[
  {
    "linkedin_url": "https://linkedin.com/company/salesql"
  }
]'
[
  {
    "uuid": "f705200f-fe17-4960-a0a9-3aea10228448",
    "name": "SalesQL",
    "website": "https://www.salesql.com",
    "website_domain": "salesql.com",
    "linkedin_url": "https://linkedin.com/company/salesql",
    "founded_year": 2018,
    "number_of_employees": "1 - 10",
    "type": "self-owned"
  },
  {
    "error": "Organization not found"
  }
]

Enrich Person

Retrieve enriched data for a person. Query parameters work in groups — you must provide a complete group:

Group 1 — LinkedIn URL

  • linkedin_url — e.g. https://linkedin.com/in/sandrocarsava

Group 2 — Name + Organization

  • first_name + last_name + organization_name
  • first_name + last_name + organization_domain
  • full_name + organization_name
  • full_name + organization_domain

Optional flags

  • match_if_direct_email — Require a direct (non-work) email
  • match_if_direct_phone — Require a direct phone number

Recommended matching strategy

- Parameters Notes
linkedin_url Highest accuracy, unique identifier
- full_name + organization_domain Reliable when LinkedIn URL is unavailable
- first_name + last_name + organization_name Use only when domain is unknown
Query Parameters
  • linkedin_url
    Type: stringFormat: uri

    LinkedIn URL of the person

  • first_name
    Type: string

    First name of the person

  • last_name
    Type: string

    Last name of the person

  • full_name
    Type: string

    Full name of the person

  • organization_name
    Type: string

    Name of the person's organization

  • organization_domain
    Type: string

    Domain of the person's organization

  • match_if_direct_email
    Type: boolean

    Require a direct (non-work) email address in the response

  • match_if_direct_phone
    Type: boolean

    Require a direct phone number in the response

Responses
  • application/json
    200
    Type: object

    Person Enrichment Response

    • person
      Type: object ·
  • application/json
    400
    Type: object

    Bad Request - The request was invalid or cannot be served

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

  • application/json
    401
    Type: object

    Unauthorized - Authentication credentials were missing or invalid

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

  • application/json
    404
    Type: object ·

    Not Found - The person was not found

    • error
      Type: string
      required

      Error message declaring that the person was not found

  • application/json
    422
    Type: object

    Missing Parameters - The request is missing required parameters

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

  • application/json
    429
    Type: object

    Rate Limit Exceeded - Too many requests

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

Request Example for get/persons/enrich
curl 'https://api-public.salesql.com/v1/persons/enrich?linkedin_url=&first_name=&last_name=&full_name=&organization_name=&organization_domain=&match_if_direct_email=false&match_if_direct_phone=false' \
  --header 'Authorization: Bearer YOUR_API_KEY'
{
  "person": {
    "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "first_name": "Sandro",
    "last_name": "Carsava",
    "full_name": "Sandro Carsava",
    "linkedin_url": "https://linkedin.com/in/sandrocarsava",
    "title": "Head, Sales Solutions Latin America",
    "headline": "Head, Sales Solutions Latin America at LinkedIn",
    "emails": [
      {
        "email": "first.last@gmail.com",
        "type": "Direct",
        "status": "Valid"
      },
      {
        "email": "first.last@company.com",
        "type": "Work",
        "status": "Valid"
      }
    ],
    "phones": [
      {
        "phone": "+1 555-123-4567",
        "type": "Personal",
        "country_code": "US",
        "is_valid": true
      },
      {
        "phone": "+1 555-987-6543",
        "type": "Work",
        "country_code": "US",
        "is_valid": true
      }
    ],
    "organization": {
      "uuid": "9473d991-87ad-43f6-91ee-a42bb54898f4",
      "name": "LinkedIn",
      "website": "https://careers.linkedin.com",
      "website_domain": "linkedin.com",
      "linkedin_url": "https://linkedin.com/company/linkedin",
      "logo": "https://cdn.example.com/company/linkedin.png",
      "founded_year": 2003,
      "number_of_employees": "10001+",
      "type": "public"
    },
    "work_experience": [
      {
        "title": "Head, Sales Solutions Latin America",
        "timestamp_start": 1577836800000,
        "is_current": true,
        "organization": {
          "uuid": "9473d991-87ad-43f6-91ee-a42bb54898f4",
          "name": "LinkedIn",
          "website": "https://careers.linkedin.com",
          "website_domain": "linkedin.com",
          "linkedin_url": "https://linkedin.com/company/linkedin",
          "logo": "https://cdn.example.com/company/linkedin.png",
          "founded_year": 2003,
          "number_of_employees": "10001+",
          "type": "public"
        }
      },
      {
        "title": "Managing Partner",
        "timestamp_start": 1483228800000,
        "is_current": true,
        "organization": {
          "name": "NOXBE Ventures"
        }
      }
    ],
    "image": "https://cdn.example.com/person/sample-profile.png",
    "timestamp_work_experience_start": 978307200000
  }
}

Bulk Enrich Persons

Enrich up to 100 persons in a single request.

Each query in the list must contain at least one of the following groups:

Group 1 — LinkedIn URL

  • linkedin_url — e.g. https://linkedin.com/in/sandrocarsava

Group 2 — Name + Organization

  • first_name + last_name + organization_name
  • first_name + last_name + organization_domain
  • full_name + organization_name
  • full_name + organization_domain

Recommended matching strategy

- Parameters Notes
linkedin_url Highest accuracy, unique identifier
- full_name + organization_domain Reliable when LinkedIn URL is unavailable
- first_name + last_name + organization_name Use only when domain is unknown
Body
required
application/json
  • Type: array object[] 1…100

    List of person search queries (max 100)

Responses
  • application/json
    200
    Type: array

    Bulk enrichment results

      • full_name
        Type: string
        required

        Full name of the Person

      • uuid
        Type: stringFormat: uuid
        required

        UUID of the Person

      • emails
        Type: array object[] ·

        Emails of the Person

      • first_name
        Type: string

        First name of the Person

      • headline
        Type: string

        LinkedIn headline of the Person

      • image
        Type: string | nullFormat: uri

        Profile image URL of the Person

      • industry
        Type: string ·

        Industry name

      • last_name
        Type: string

        Last name of the Person

      • linkedin_url
        Type: stringFormat: uri

        LinkedIn URL of the Person

      • location
        Type: object ·
      • organization
        Type: object ·
      • phones
        Type: array object[] ·

        Phone numbers of the Person

      • timestamp_work_experience_start
        Type: integer | null

        Earliest work experience start date as Unix timestamp in milliseconds

      • title
        Type: string

        Title/Position of the Person

      • work_experience
        Type: array object[] ·

        Work experience history of the Person

  • application/json
    401
    Type: object

    Unauthorized - Authentication credentials were missing or invalid

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

  • application/json
    422
    Type: object

    Missing Parameters - The request is missing required parameters

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

  • application/json
    429
    Type: object

    Rate Limit Exceeded - Too many requests

    • detail
      Type: string
      required

      Error message

    • status
      Type: integer
      required

      HTTP status code

Request Example for post/persons/enrich/bulk
curl https://api-public.salesql.com/v1/persons/enrich/bulk \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --data '[
  {
    "linkedin_url": "https://linkedin.com/in/sandrocarsava"
  }
]'
[
  {
    "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "first_name": "Sandro",
    "last_name": "Carsava",
    "full_name": "Sandro Carsava",
    "linkedin_url": "https://linkedin.com/in/sandrocarsava",
    "title": "Head, Sales Solutions Latin America",
    "headline": "Head, Sales Solutions Latin America at LinkedIn",
    "emails": [
      {
        "email": "first.last@gmail.com",
        "type": "Direct",
        "status": "Valid"
      },
      {
        "email": "first.last@company.com",
        "type": "Work",
        "status": "Valid"
      }
    ],
    "phones": [
      {
        "phone": "+1 555-123-4567",
        "type": "Personal",
        "country_code": "US",
        "is_valid": true
      },
      {
        "phone": "+1 555-987-6543",
        "type": "Work",
        "country_code": "US",
        "is_valid": true
      }
    ],
    "organization": {
      "uuid": "9473d991-87ad-43f6-91ee-a42bb54898f4",
      "name": "LinkedIn",
      "website": "https://careers.linkedin.com",
      "website_domain": "linkedin.com",
      "linkedin_url": "https://linkedin.com/company/linkedin",
      "logo": "https://cdn.example.com/company/linkedin.png",
      "founded_year": 2003,
      "number_of_employees": "10001+",
      "type": "public"
    },
    "work_experience": [
      {
        "title": "Head, Sales Solutions Latin America",
        "timestamp_start": 1577836800000,
        "is_current": true,
        "organization": {
          "uuid": "9473d991-87ad-43f6-91ee-a42bb54898f4",
          "name": "LinkedIn",
          "website": "https://careers.linkedin.com",
          "website_domain": "linkedin.com",
          "linkedin_url": "https://linkedin.com/company/linkedin",
          "logo": "https://cdn.example.com/company/linkedin.png",
          "founded_year": 2003,
          "number_of_employees": "10001+",
          "type": "public"
        }
      },
      {
        "title": "Managing Partner",
        "timestamp_start": 1483228800000,
        "is_current": true,
        "organization": {
          "name": "NOXBE Ventures"
        }
      }
    ],
    "image": "https://cdn.example.com/person/sample-profile.png",
    "timestamp_work_experience_start": 978307200000
  },
  {
    "error": "Person not found"
  }
]

Changelog

Track API changes, new features, and breaking changes.

v2.31.0 — 2026-05-04
  • New bulk organization enrichment endpoint (POST /v1/organizations/enrich/bulk)
  • Enrich up to 100 organizations per request with a single API call
  • Credits charged only for results that include email addresses
v2.29.0 — 2026-04-29
  • New bulk person enrichment endpoint (POST /v1/persons/enrich/bulk)
  • Enrich up to 100 persons per request with a single API call
  • Credits charged only for results that include email addresses
v2.28.3 — 2026-04-23
  • Improved Organization search with website domain and name filters

v2.20.3 — 2026-03-31

  • Fixed critical bug for searching by Sales Navigator URLs

v2.20.0 — 2026-03-24

  • Profile image support with presigned URLs
  • Added image field to Person enrichment response
  • Image URL generation with secure access tokens

v2.17.1 — 2026-01-12

  • Reveal contact info with parameterized queries
  • Enhanced contact visibility controls
  • Unified metrics events across products

v2.14.0 — 2025-11-06

  • Location data improvements for person enrichment

v2.11.1 — 2025-09-18

  • Improved rate limit monitoring and analytics

v2.11.0 — 2025-08-29

  • API key allowance endpoint (GET /v1/allowance)
  • Check remaining credits programmatically
  • Usage tracking per API key

v2.0.0 — 2025-08-21

  • Initial public API release with person enrichment endpoint
  • Bearer token authentication
  • Rate limiting with per-minute and per-day quotas
  • Credit-based usage model