Skip to main content

Endpoint Quick Reference

All v2 endpoints at a glance. Base URL: https://api.blitz-api.ai. All endpoints use POST except key-info.
EndpointMethodDescriptionPlan required
/v2/account/key-infoGETCheck API key validity & rate limitAny
/v2/search/waterfall-icp-keywordPOSTFind decision-makers by cascade hierarchyUnlimited Leads+
/v2/search/employee-finderPOSTSearch employees by role & seniorityUnlimited Leads+
/v2/search/companiesPOSTFind companies by filtersUnlimited Leads+
/v2/enrichment/emailPOSTLinkedIn profile URL → verified work emailUnlimited Email+
/v2/enrichment/phonePOSTLinkedIn profile URL → phone (US only)Unlimited Phone
/v2/enrichment/email-to-personPOSTWork email → full person profileUnlimited Leads+
/v2/enrichment/phone-to-personPOSTPhone number → full person profileUnlimited Leads+
/v2/enrichment/companyPOSTCompany LinkedIn URL → company profileUnlimited Leads+
/v2/enrichment/domain-to-linkedinPOSTWebsite domain → Company LinkedIn URLUnlimited Leads+
/v2/enrichment/linkedin-to-domainPOSTCompany LinkedIn URL → email domainUnlimited Leads+
/v2/utilities/email/validatePOSTValidate email deliverability (SMTP)Unlimited Leads+
/v2/utilities/current-datePOSTGet current server date/timeAny

Base Setup

Every request requires the x-api-key header. The client below handles rate limiting, retries on 429, and error handling.
Never expose your API key in client-side code (browsers, mobile apps). Always call the Blitz API from your backend.
const BLITZ_API_KEY = "YOUR_API_KEY";
const BLITZ_BASE_URL = "https://api.blitz-api.ai";

// Replace 5 with the max_requests_per_seconds value from /v2/account/key-info
function createRateLimiter(maxRps) {
  const timestamps = [];
  let pending = Promise.resolve();

  return () => {
    pending = pending.then(
      () =>
        new Promise((resolve) => {
          const poll = () => {
            const now = Date.now();
            while (timestamps.length && timestamps[0] <= now - 1000)
              timestamps.shift();
            if (timestamps.length < maxRps) {
              timestamps.push(Date.now());
              resolve();
            } else {
              setTimeout(poll, timestamps[0] + 1000 - now + 1);
            }
          };
          poll();
        })
    );
    return pending;
  };
}

const rateLimit = createRateLimiter(5);

async function blitzRequest(method, path, payload) {
  const headers = {
    "x-api-key": BLITZ_API_KEY,
    "Content-Type": "application/json",
  };

  for (let attempt = 0; attempt < 3; attempt++) {
    try {
      await rateLimit();

      const res = await fetch(`${BLITZ_BASE_URL}${path}`, {
        method,
        headers,
        body: payload ? JSON.stringify(payload) : undefined,
      });

      if (res.status === 429) {
        console.log("Rate limited by server, waiting 60s...");
        await new Promise((r) => setTimeout(r, 60000));
        continue;
      }

      if (res.status === 402) {
        console.error("Insufficient credits");
        return null;
      }

      if (res.status === 401) {
        console.error("Invalid API key");
        return null;
      }

      if (res.ok) return await res.json();

      await new Promise((r) => setTimeout(r, 2 ** attempt * 1000));
    } catch (error) {
      if (attempt === 2) {
        console.error(`API error: ${error.message}`);
        return null;
      }
      await new Promise((r) => setTimeout(r, 2000));
    }
  }
  return null;
}

Check API Key — GET /v2/account/key-info

Verify your key and check your account status. Use as a health check before batch jobs.
const info = await blitzRequest("GET", "/v2/account/key-info");

console.log(`Valid: ${info.valid}`);
console.log(`Credits remaining: ${info.remaining_credits}`);
console.log(`Rate limit: ${info.max_requests_per_seconds} req/s`);
console.log(`Allowed endpoints: ${info.allowed_apis.join(", ")}`);

Waterfall ICP Search — POST /v2/search/waterfall-icp-keyword

Find the best decision-maker at a company using a prioritized cascade. The engine tries each tier in order and fills results from the highest-priority match first. icp = cascade tier matched (1 = top priority). ranking = overall position in the company (1 = most relevant).
const result = await blitzRequest("POST", "/v2/search/waterfall-icp-keyword", {
  company_linkedin_url: "https://www.linkedin.com/company/openai",
  cascade: [
    {
      include_title: ["CTO", "VP Engineering", "Head of Engineering"],
      exclude_title: ["assistant", "intern", "junior"],
      location: ["WORLD"],
      include_headline_search: false,
    },
    {
      include_title: ["Engineering Director", "Engineering Manager"],
      exclude_title: ["junior", "intern"],
      location: ["WORLD"],
      include_headline_search: false,
    },
    {
      include_title: ["CEO", "Founder", "CTO"],
      exclude_title: ["intern"],
      location: ["WORLD"],
      include_headline_search: false,
    },
  ],
  max_results: 5,
});

for (const person of result.results) {
  const p = person.person;
  console.log(`[Tier ${person.icp} | Rank #${person.ranking}] ${p.full_name}${p.headline}`);
  console.log(`  LinkedIn: ${p.linkedin_url}`);
  // icp: which cascade tier matched (1 = top priority)
  // ranking: overall position in company (1 = most relevant)
}

Email Enrichment — POST /v2/enrichment/email

Retrieve a verified work email from a LinkedIn profile URL. Requires Unlimited Email plan or above.
const result = await blitzRequest("POST", "/v2/enrichment/email", {
  person_linkedin_url: "https://www.linkedin.com/in/example-person",
});

if (result.found) {
  console.log(`Email: ${result.email}`);
} else {
  console.log("No verified email found.");
}

Phone Enrichment — POST /v2/enrichment/phone

Retrieve a direct phone number from a LinkedIn profile URL. US contacts only. Requires Unlimited Phone Numbers plan.
const result = await blitzRequest("POST", "/v2/enrichment/phone", {
  person_linkedin_url: "https://www.linkedin.com/in/example-person",
});

if (result.found) {
  console.log(`Phone: ${result.phone}`);
}

Company Enrichment — POST /v2/enrichment/company

Retrieve a full company profile from a LinkedIn company URL.
const result = await blitzRequest("POST", "/v2/enrichment/company", {
  company_linkedin_url: "https://www.linkedin.com/company/openai",
});

console.log(`Name: ${result.company.name}`);
console.log(`Industry: ${result.company.industry}`);
console.log(`Employees: ${result.company.employee_count}`);

Domain → LinkedIn URL — POST /v2/enrichment/domain-to-linkedin

Convert a website domain to a Company LinkedIn URL. Use this as the first step when your source data only contains domains. Returns found (boolean) and company_linkedin_url (string).
const result = await blitzRequest("POST", "/v2/enrichment/domain-to-linkedin", {
  domain: "openai.com",
});

if (result.found) {
  console.log(`LinkedIn URL: ${result.company_linkedin_url}`);
  // Now use this URL for Waterfall ICP, Employee Finder, or Company Enrichment
}

Email Validation — POST /v2/utilities/email/validate

Validate an email address via live SMTP handshake. Use before enrolling leads in cold email sequences.
const result = await blitzRequest("POST", "/v2/utilities/email/validate", {
  email: "jane.doe@acme.com",
});

// status: "valid" | "catch_all" | "invalid"
console.log(`Status: ${result.status}`);
console.log(`Deliverable: ${result.deliverable}`);
Routing by validation status:
  • "valid" → Enroll in aggressive cold email sequence
  • "catch_all" → Route to LinkedIn sequence or manual review
  • "invalid" → Mark as Do Not Contact in CRM

Employee Finder — POST /v2/search/employee-finder

Search employees at a company by job level, department, and location. Supports pagination. See Employee Finder guide for full documentation. Pagination: increment page to fetch the next page. The response includes total_pages.
const result = await blitzRequest("POST", "/v2/search/employee-finder", {
  company_linkedin_url: "https://www.linkedin.com/company/openai",
  job_level: ["C-Team", "VP", "Director"],
  job_function: ["Sales & Business Development"],
  sales_region: ["NORAM"],
  max_results: 10,
  page: 1,
});

console.log(`Page ${result.page} of ${result.total_pages} (${result.results_length} results)`);
for (const person of result.results) {
  // Employee Finder returns person fields directly (not nested in .person)
  console.log(`${person.full_name}${person.headline}`);
  console.log(`  LinkedIn: ${person.linkedin_url}`);
}

Company Search — POST /v2/search/companies

Find companies matching ICP criteria (industry, size, location, keywords). Supports cursor-based pagination. See Company Search guide for full documentation. Pagination: pass the cursor from the response to fetch the next page. cursor: null means last page.
const result = await blitzRequest("POST", "/v2/search/companies", {
  company: {
    keywords: { include: ["SaaS"] },
    industry: { include: ["Software Development"] },
    hq: { country_code: ["FR", "DE"] },
    employee_range: ["51-200", "201-500"],
  },
  max_results: 25,
});

for (const company of result.results) {
  console.log(`${company.name}${company.industry}`);
  console.log(`  LinkedIn: ${company.linkedin_url}`);
  console.log(`  Employees: ${company.employee_count}`);
}

// Paginate with cursor
if (result.cursor) {
  const nextPage = await blitzRequest("POST", "/v2/search/companies", {
    company: {
      keywords: { include: ["SaaS"] },
      industry: { include: ["Software Development"] },
      hq: { country_code: ["FR", "DE"] },
      employee_range: ["51-200", "201-500"],
    },
    max_results: 25,
    cursor: result.cursor,
  });
}

LinkedIn → Domain — POST /v2/enrichment/linkedin-to-domain

Get the email domain associated with a Company LinkedIn URL.
const result = await blitzRequest("POST", "/v2/enrichment/linkedin-to-domain", {
  company_linkedin_url: "https://www.linkedin.com/company/openai",
});

if (result.found) {
  console.log(`Email domain: ${result.email_domain}`);
}

Reverse Email Lookup — POST /v2/enrichment/email-to-person

Get a full person profile from a known work email.
const result = await blitzRequest("POST", "/v2/enrichment/email-to-person", {
  email: "jane.doe@acme.com",
});

if (result.found) {
  const person = result.person.person;
  console.log(`Name: ${person.full_name}`);
  console.log(`LinkedIn: ${person.linkedin_url}`);
  console.log(`Headline: ${person.headline}`);
}

Reverse Phone Lookup — POST /v2/enrichment/phone-to-person

Get a full person profile from a phone number. US numbers only.
const result = await blitzRequest("POST", "/v2/enrichment/phone-to-person", {
  phone: "+14155551234",
});

if (result.found) {
  const person = result.person.person;
  console.log(`Name: ${person.full_name}`);
  console.log(`LinkedIn: ${person.linkedin_url}`);
}