EfficientPIM Header
Email Scraper API Documentation

Email Scraper API

Developer guide for programmatic B2B lead discovery and job management

Overview

The Email Scraper API allows you to programmatically submit email scraping jobs, monitor their progress, and retrieve results. Our system leverages AI-powered discovery to find verified B2B contacts based on your specific niche and industry requirements.

Base Endpoint

https://efficientpim.com/api/ess
Authorization Note: All API requests require a unique API key generated from your user dashboard.

Pricing and Credits

Our service operates on a transparent credit system. Credits are consumed based on the volume of leads discovered.

ActionCredit CostDetails
Standard Scraping1 Credit per LeadStandard discovery rate. Minimum 1,000 leads per job.
Deduplication Fee+0.2 Credits per LeadApplies when skip_dupes is enabled. Filters against all historical jobs.

Authentication

Requests must be authenticated using your Private API Key via one of the following methods:

Method 1: JSON Request Body (Preferred for POST)

{ "api_key": "your_private_api_key", "niche": "niche description" }

Method 2: Query Parameter (Preferred for GET)

GET /api/ess/balance?api_key=your_private_api_key

Submit Scraping Job

POST /submit

Initializes a new scraping request for lead discovery.

Parameters

ParameterTypeStatusDescription
api_keystringRequiredYour Private API key
nichestringRequiredIndustry description (e.g. "Roofing contractors in Texas")
target_countintegerRequiredLead volume requested (1,000 to 10,000)
skip_dupesbooleanOptionalSet to true to skip previous leads (+20% fee)

Example cURL Request

curl -X POST "https://efficientpim.com/api/ess/submit" \ -H "Content-Type: application/json" \ -d '{ "api_key": "your_private_api_key", "niche": "Data analysts in London", "target_count": 1000, "skip_dupes": true }'

Request Chaining and Cooldowns

To ensure system stability, we enforce a mandatory submission interval between jobs.

Submission Rule: You must wait a minimum of 10 seconds before submitting a new job.

When automating multiple niches, your implementation should handle 429 Too Many Requests errors by pausing execution before retrying.

Check Job Status

GET /status/{job_id}

Poll this endpoint to track discovery progress. Typical values include pending, processing, completed, or failed.

GET https://efficientpim.com/api/ess/status/8542?api_key=your_key

Retrieve Job Results

GET /results/{job_id}

Retrieve the verified leads list. Supports json (default) or csv formats.

GET https://efficientpim.com/api/ess/results/8542?api_key=your_key&format=csv

Code Examples

Continuous Automation (Node.js)

const axios = require('axios');async function automateScraping() { const targets = ['marketing firms', 'lawyers', 'real estate agents']; for (const niche of targets) { try { const res = await axios.post('https://efficientpim.com/api/ess/submit', { api_key: 'YOUR_KEY', niche: niche, target_count: 500 }); console.log(`Submitted Job ID: ${res.data.job_id}`); await new Promise(resolve => setTimeout(resolve, 15000)); // Delay for cooldown } catch (err) { if (err.response?.status === 429) { console.log('Cooldown active, waiting 30 seconds...'); await new Promise(resolve => setTimeout(resolve, 30000)); } } } }

Bulk Processing (PHP)

<?php $api_key = 'YOUR_KEY'; $niches = ['marketing firms', 'dentists'];foreach ($niches as $niche) { $curl = curl_init('https://efficientpim.com/api/ess/submit'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode([ 'api_key' => $api_key, 'niche' => $niche, 'target_count' => 100 ])); $response = curl_exec($curl); $status = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); if ($status == 200) { echo "Job started for $niche. Pausing 15 seconds.\n"; sleep(15); } elseif ($status == 429) { echo "Rate limit hit. Pausing 30 seconds.\n"; sleep(30); } } ?>

Simple Integration (Python)

import requests import timeendpoint = "https://efficientpim.com/api/ess/submit" payload = { "api_key": "YOUR_KEY", "niche": "interior designers", "target_count": 500 }response = requests.post(endpoint, json=payload) if response.status_code == 200: print(f"Discovery Initiated: {response.json().get('job_id')}") time.sleep(15)
Technical Support: If you encounter issues, please contact us via Telegram or email.