{"id":337,"date":"2025-11-23T16:26:32","date_gmt":"2025-11-23T16:26:32","guid":{"rendered":"https:\/\/efficientpim.com\/?page_id=337"},"modified":"2026-01-23T12:10:16","modified_gmt":"2026-01-23T12:10:16","slug":"api-docs","status":"publish","type":"page","link":"https:\/\/efficientpim.com\/api-docs\/","title":{"rendered":"API Docs"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"337\" class=\"elementor elementor-337\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6b34a26 e-flex e-con-boxed e-con e-parent\" data-id=\"6b34a26\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c669325 elementor-widget elementor-widget-html\" data-id=\"c669325\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>Email Scraper API Documentation<\/title>\r\n    <style>\r\n        * { margin: 0; padding: 0; box-sizing: border-box; }\r\n        body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; background: #f8f9fa; }\r\n        .container { max-width: 1200px; margin: 0 auto; padding: 20px; }\r\n        .header { background: #1e293b; color: white; padding: 60px 0; text-align: center; margin-bottom: 30px; border-bottom: 4px solid #3b82f6; }\r\n        .header h1 { font-size: 2.5rem; margin-bottom: 10px; font-weight: 800; }\r\n        .header p { font-size: 1.2rem; opacity: 0.9; }\r\n        .nav { background: white; padding: 20px; border-radius: 8px; margin-bottom: 30px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); position: sticky; top: 10px; z-index: 1000; }\r\n        .nav ul { list-style: none; display: flex; flex-wrap: wrap; gap: 20px; justify-content: center; }\r\n        .nav a { text-decoration: none; color: #475569; font-weight: 600; padding: 8px 16px; border-radius: 4px; transition: background 0.3s; }\r\n        .nav a:hover { background: #f1f5f9; color: #3b82f6; }\r\n        .section { background: white; margin-bottom: 30px; padding: 40px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); border: 1px solid #e2e8f0; }\r\n        .section h2 { color: #1e293b; border-bottom: 3px solid #3b82f6; padding-bottom: 10px; margin-bottom: 20px; }\r\n        .section h3 { color: #334155; margin: 30px 0 15px 0; font-size: 1.3rem; }\r\n        .endpoint { background: #f8f9fa; border-left: 4px solid #10b981; padding: 20px; margin: 20px 0; border-radius: 4px; border: 1px solid #e2e8f0; border-left-width: 4px; }\r\n        .method { display: inline-block; padding: 4px 10px; border-radius: 4px; color: white; font-weight: 800; font-size: 0.75rem; margin-right: 12px; text-transform: uppercase; }\r\n        .method.post { background: #10b981; }\r\n        .method.get { background: #3b82f6; }\r\n        .code-block { background: #0f172a; color: #f1f5f9; padding: 25px; border-radius: 6px; overflow-x: auto; margin: 15px 0; font-family: 'ui-monospace', 'SFMono-Regular', monospace; font-size: 14px; line-height: 1.5; }\r\n        .params-table { width: 100%; border-collapse: collapse; margin: 20px 0; }\r\n        .params-table th, .params-table td { padding: 15px; text-align: left; border-bottom: 1px solid #e2e8f0; }\r\n        .params-table th { background: #f8fafc; font-weight: 700; color: #475569; }\r\n        .params-table .required { color: #ef4444; font-weight: bold; font-size: 12px; }\r\n        .params-table .optional { color: #64748b; font-size: 12px; }\r\n        .alert { padding: 15px; margin: 20px 0; border-radius: 4px; border: 1px solid transparent; }\r\n        .alert-info { background: #eff6ff; color: #1e40af; border-color: #bfdbfe; }\r\n        .alert-warning { background: #fffbeb; color: #92400e; border-color: #fde68a; }\r\n        \r\n        @media (max-width: 768px) {\r\n            .nav ul { flex-direction: column; align-items: center; }\r\n            .header h1 { font-size: 1.8rem; }\r\n        }\r\n    <\/style>\r\n<\/head>\r\n<body>\r\n    <div class=\"header\">\r\n        <div class=\"container\">\r\n            <h1>Email Scraper API<\/h1>\r\n            <p>Developer guide for programmatic B2B lead discovery and job management<\/p>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"container\">\r\n        <nav class=\"nav\">\r\n            <ul>\r\n                <li><a href=\"#overview\">Overview<\/a><\/li>\r\n                <li><a href=\"#pricing\">Pricing<\/a><\/li>\r\n                <li><a href=\"#authentication\">Authentication<\/a><\/li>\r\n                <li><a href=\"#submit-job\">Submit Job<\/a><\/li>\r\n                <li><a href=\"#chaining\">Request Chaining<\/a><\/li>\r\n                <li><a href=\"#job-status\">Status<\/a><\/li>\r\n                <li><a href=\"#get-results\">Results<\/a><\/li>\r\n                <li><a href=\"#examples\">Code Examples<\/a><\/li>\r\n            <\/ul>\r\n        <\/nav>\r\n\r\n        <section id=\"overview\" class=\"section\">\r\n            <h2>Overview<\/h2>\r\n            <p>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.<\/p>\r\n            \r\n            <h3>Base Endpoint<\/h3>\r\n            <div class=\"code-block\">https:\/\/efficientpim.com\/api\/ess<\/div>\r\n            \r\n            <div class=\"alert alert-info\">\r\n                <strong>Authorization Note:<\/strong> All API requests require a unique API key generated from your user dashboard.\r\n            <\/div>\r\n        <\/section>\r\n\r\n        <section id=\"pricing\" class=\"section\">\r\n            <h2>Pricing and Credits<\/h2>\r\n            <p>Our service operates on a transparent credit system. Credits are consumed based on the volume of leads discovered.<\/p>\r\n            \r\n            <table class=\"params-table\">\r\n                <thead>\r\n                    <tr>\r\n                        <th>Action<\/th>\r\n                        <th>Credit Cost<\/th>\r\n                        <th>Details<\/th>\r\n                    <\/tr>\r\n                <\/thead>\r\n                <tbody>\r\n                    <tr>\r\n                        <td><strong>Standard Scraping<\/strong><\/td>\r\n                        <td>1 Credit per Lead<\/td>\r\n                        <td>Standard discovery rate. Minimum 1,000 leads per job.<\/td>\r\n                    <\/tr>\r\n                    <tr>\r\n                        <td><strong>Deduplication Fee<\/strong><\/td>\r\n                        <td>+0.2 Credits per Lead<\/td>\r\n                        <td>Applies when <code>skip_dupes<\/code> is enabled. Filters against all historical jobs.<\/td>\r\n                    <\/tr>\r\n                <\/tbody>\r\n            <\/table>\r\n        <\/section>\r\n\r\n        <section id=\"authentication\" class=\"section\">\r\n            <h2>Authentication<\/h2>\r\n            <p>Requests must be authenticated using your Private API Key via one of the following methods:<\/p>\r\n            <h3>Method 1: JSON Request Body (Preferred for POST)<\/h3>\r\n            <div class=\"code-block\">{ \"api_key\": \"your_private_api_key\", \"niche\": \"niche description\" }<\/div>\r\n            <h3>Method 2: Query Parameter (Preferred for GET)<\/h3>\r\n            <div class=\"code-block\">GET \/api\/ess\/balance?api_key=your_private_api_key<\/div>\r\n        <\/section>\r\n\r\n        <section id=\"submit-job\" class=\"section\">\r\n            <h2>Submit Scraping Job<\/h2>\r\n            <div class=\"endpoint\">\r\n                <span class=\"method post\">POST<\/span>\r\n                <code>\/submit<\/code>\r\n            <\/div>\r\n            <p>Initializes a new scraping request for lead discovery.<\/p>\r\n\r\n            <h3>Parameters<\/h3>\r\n            <table class=\"params-table\">\r\n                <thead>\r\n                    <tr>\r\n                        <th>Parameter<\/th>\r\n                        <th>Type<\/th>\r\n                        <th>Status<\/th>\r\n                        <th>Description<\/th>\r\n                    <\/tr>\r\n                <\/thead>\r\n                <tbody>\r\n                    <tr><td><code>api_key<\/code><\/td><td>string<\/td><td><span class=\"required\">Required<\/span><\/td><td>Your Private API key<\/td><\/tr>\r\n                    <tr><td><code>niche<\/code><\/td><td>string<\/td><td><span class=\"required\">Required<\/span><\/td><td>Industry description (e.g. \"Roofing contractors in Texas\")<\/td><\/tr>\r\n                    <tr><td><code>target_count<\/code><\/td><td>integer<\/td><td><span class=\"required\">Required<\/span><\/td><td>Lead volume requested (1,000 to 10,000)<\/td><\/tr>\r\n                    <tr><td><code>skip_dupes<\/code><\/td><td>boolean<\/td><td><span class=\"optional\">Optional<\/span><\/td><td>Set to <code>true<\/code> to skip previous leads (+20% fee)<\/td><\/tr>\r\n                <\/tbody>\r\n            <\/table>\r\n\r\n            <h3>Example cURL Request<\/h3>\r\n            <div class=\"code-block\">curl -X POST \"https:\/\/efficientpim.com\/api\/ess\/submit\" \\\r\n  -H \"Content-Type: application\/json\" \\\r\n  -d '{\r\n    \"api_key\": \"your_private_api_key\",\r\n    \"niche\": \"Data analysts in London\",\r\n    \"target_count\": 1000,\r\n    \"skip_dupes\": true\r\n  }'<\/div>\r\n        <\/section>\r\n\r\n        <section id=\"chaining\" class=\"section\">\r\n            <h2>Request Chaining and Cooldowns<\/h2>\r\n            <p>To ensure system stability, we enforce a mandatory submission interval between jobs.<\/p>\r\n            <div class=\"alert alert-warning\">\r\n                <strong>Submission Rule:<\/strong> You must wait a minimum of 10 seconds before submitting a new job.\r\n            <\/div>\r\n            <p>When automating multiple niches, your implementation should handle <code>429 Too Many Requests<\/code> errors by pausing execution before retrying.<\/p>\r\n        <\/section>\r\n\r\n        <section id=\"job-status\" class=\"section\">\r\n            <h2>Check Job Status<\/h2>\r\n            <div class=\"endpoint\">\r\n                <span class=\"method get\">GET<\/span>\r\n                <code>\/status\/{job_id}<\/code>\r\n            <\/div>\r\n            <p>Poll this endpoint to track discovery progress. Typical values include <code>pending<\/code>, <code>processing<\/code>, <code>completed<\/code>, or <code>failed<\/code>.<\/p>\r\n            <div class=\"code-block\">GET https:\/\/efficientpim.com\/api\/ess\/status\/8542?api_key=your_key<\/div>\r\n        <\/section>\r\n\r\n        <section id=\"get-results\" class=\"section\">\r\n            <h2>Retrieve Job Results<\/h2>\r\n            <div class=\"endpoint\">\r\n                <span class=\"method get\">GET<\/span>\r\n                <code>\/results\/{job_id}<\/code>\r\n            <\/div>\r\n            <p>Retrieve the verified leads list. Supports <code>json<\/code> (default) or <code>csv<\/code> formats.<\/p>\r\n            <div class=\"code-block\">GET https:\/\/efficientpim.com\/api\/ess\/results\/8542?api_key=your_key&format=csv<\/div>\r\n        <\/section>\r\n\r\n        <section id=\"examples\" class=\"section\">\r\n            <h2>Code Examples<\/h2>\r\n            \r\n            <h3>Continuous Automation (Node.js)<\/h3>\r\n            <div class=\"code-block\">const axios = require('axios');\r\n\r\nasync function automateScraping() {\r\n    const targets = ['marketing firms', 'lawyers', 'real estate agents'];\r\n    for (const niche of targets) {\r\n        try {\r\n            const res = await axios.post('https:\/\/efficientpim.com\/api\/ess\/submit', {\r\n                api_key: 'YOUR_KEY',\r\n                niche: niche,\r\n                target_count: 500\r\n            });\r\n            console.log(`Submitted Job ID: ${res.data.job_id}`);\r\n            await new Promise(resolve => setTimeout(resolve, 15000)); \/\/ Delay for cooldown\r\n        } catch (err) {\r\n            if (err.response?.status === 429) {\r\n                console.log('Cooldown active, waiting 30 seconds...');\r\n                await new Promise(resolve => setTimeout(resolve, 30000));\r\n            }\r\n        }\r\n    }\r\n}<\/div>\r\n\r\n            <h3>Bulk Processing (PHP)<\/h3>\r\n            <div class=\"code-block\">&lt;?php\r\n$api_key = 'YOUR_KEY';\r\n$niches = ['marketing firms', 'dentists'];\r\n\r\nforeach ($niches as $niche) {\r\n    $curl = curl_init('https:\/\/efficientpim.com\/api\/ess\/submit');\r\n    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);\r\n    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode([\r\n        'api_key' => $api_key,\r\n        'niche' => $niche,\r\n        'target_count' => 100\r\n    ]));\r\n    $response = curl_exec($curl);\r\n    $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);\r\n    curl_close($curl);\r\n    \r\n    if ($status == 200) {\r\n        echo \"Job started for $niche. Pausing 15 seconds.\\n\";\r\n        sleep(15);\r\n    } elseif ($status == 429) {\r\n        echo \"Rate limit hit. Pausing 30 seconds.\\n\";\r\n        sleep(30);\r\n    }\r\n}\r\n?&gt;<\/div>\r\n\r\n            <h3>Simple Integration (Python)<\/h3>\r\n            <div class=\"code-block\">import requests\r\nimport time\r\n\r\nendpoint = \"https:\/\/efficientpim.com\/api\/ess\/submit\"\r\npayload = {\r\n    \"api_key\": \"YOUR_KEY\",\r\n    \"niche\": \"interior designers\",\r\n    \"target_count\": 500\r\n}\r\n\r\nresponse = requests.post(endpoint, json=payload)\r\nif response.status_code == 200:\r\n    print(f\"Discovery Initiated: {response.json().get('job_id')}\")\r\n    time.sleep(15)<\/div>\r\n        <\/section>\r\n\r\n        <div class=\"alert alert-info\">\r\n            <strong>Technical Support:<\/strong> If you encounter issues, please contact us via Telegram or email.\r\n        <\/div>\r\n    <\/div>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Email Scraper API Documentation Email Scraper API Developer guide for programmatic B2B lead discovery and job management Overview Pricing Authentication Submit Job Request Chaining Status Results Code Examples 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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-337","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/efficientpim.com\/api\/wp\/v2\/pages\/337","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/efficientpim.com\/api\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/efficientpim.com\/api\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/efficientpim.com\/api\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/efficientpim.com\/api\/wp\/v2\/comments?post=337"}],"version-history":[{"count":46,"href":"https:\/\/efficientpim.com\/api\/wp\/v2\/pages\/337\/revisions"}],"predecessor-version":[{"id":6976,"href":"https:\/\/efficientpim.com\/api\/wp\/v2\/pages\/337\/revisions\/6976"}],"wp:attachment":[{"href":"https:\/\/efficientpim.com\/api\/wp\/v2\/media?parent=337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}