Documentazione dell'API
Un'API REST semplice. Lei invia una richiesta e riceve JSON.
Autenticazione
Ogni chiamata richiede la Sua chiave API, tranne /v1/sample. La invii nell'header X-API-Key oppure nell'header Authorization: Bearer. Trova la chiave nella pagina Account.
Le chiavi iniziano con eldb_live_. Tenga segreta la Sua: non la inserisca mai nel codice di una pagina web.
curl https://api.ecommerce-leads-database.com/v1/me \ -H "X-API-Key: eldb_live_…" # Oppure, in alternativa: curl https://api.ecommerce-leads-database.com/v1/me \ -H "Authorization: Bearer eldb_live_…"
Endpoint
Tutti gli URL partono da https://api.ecommerce-leads-database.com.
/v1/sampleCampione gratuito (senza chiave)
Restituisce alcuni negozi: 10 di default, al massimo 20. Serve a vedere la forma dei dati prima di abbonarsi. Non conta nella quota.
curl "https://api.ecommerce-leads-database.com/v1/sample?limit=10"
/v1/meIl Suo piano e la Sua quota
Restituisce il Suo piano, le richieste e i negozi usati, i Suoi database e la data di azzeramento. Gratuito: non consuma né richieste né negozi.
curl https://api.ecommerce-leads-database.com/v1/me \
-H "X-API-Key: eldb_live_…"
{
"plan": "api_pro",
"planLabel": "Pro",
"requests": { "limit": 25000, "used": … },
"stores": { "limit": 10000, "used": … },
"databases": { "slots": 3, "selected": ["shopify", "woocommerce", "prestashop"] },
"exports": true,
"resetAt": "…"
}/v1/stores/countContare i negozi
Restituisce il numero di negozi che corrispondono ai filtri e quanti hanno una scheda Google. Costa 1 richiesta e 0 negozi.
Parametri: platform, tld, country, hasGmb, hasEmail, hasPhone, app, currency, lang, operatorCountry, activeOnly, genericEmailsOnly, includeUnverified, includeAliases, maxChromeRank, mailProvider, dmarcPolicy, trackingId, hasDecisionMaker, hasDecisionMakerEmail
curl "https://api.ecommerce-leads-database.com/v1/stores/count?platform=shopify" \
-H "X-API-Key: eldb_live_…"
{ "count": 29331, "gmbCount": 6511 }Numeri reali per i negozi Shopify verificati.
/v1/stores/searchCercare negozi
Filtra il database e restituisce una pagina di risultati (items) con un cursore (nextCursor).
Parametri: platform, tld, country, minProducts, hasGmb, hasEmail, hasPhone, app, currency, lang, operatorCountry, activeOnly, genericEmailsOnly, includeUnverified, includeAliases, maxChromeRank, mailProvider, dmarcPolicy, trackingId, hasDecisionMaker, hasDecisionMakerEmail, cursor, limit
- limit: da 1 a 100 risultati per pagina. 50 di default.
- Ordinamento: dal traffico più alto al più basso. I negozi senza traffico noto compaiono per ultimi.
- Di default, search e count restituiscono solo i negozi verificati: veri negozi online, ricontrollati sul loro sito. Aggiunga includeUnverified=true per includere anche i siti vetrina e i siti irraggiungibili.
- activeOnly è true per impostazione predefinita: i negozi valutati inattivi sono esclusi. Aggiungi activeOnly=false per includerli.
- Filtri: hasEmail (email raccolta negli ultimi 12 mesi), hasPhone, app (un'app rilevata, es. Klaviyo), currency (EUR), lang (fr), operatorCountry (FR), genericEmailsOnly (con hasEmail: solo caselle generiche). Un valore non valido restituisce 400 invalid_parameter e la richiesta non viene addebitata.
- maxChromeRank (fascia massima della classifica del Chrome UX Report: 1000, 5000, 10000, 50000, 100000, 500000, 1000000, 5000000, 10000000 o 50000000). Qualsiasi altro valore restituisce 400 invalid_parameter. Il campo audience contiene dati del Chrome UX Report (Google), con licenza CC BY-SA 4.0.
- mailProvider (fornitore di posta ricavato dall'MX: google-workspace, microsoft-365, ovh, infomaniak, ionos, gandi, zoho, proton, o2switch, hostinger, other, none) e dmarcPolicy (none, quarantine, reject o missing). Qualsiasi altro valore restituisce 400 invalid_parameter. Il filtro app trova anche gli strumenti letti nel DNS (per esempio Klaviyo tramite SPF). Slug delle app che il DNS può aggiungere: klaviyo, mailchimp, brevo, shopify email, mailjet, sendgrid, hubspot, salesforce marketing cloud, omnisend, mandrill, amazon ses, zendesk, mailgun, meta business, google site verification, pinterest, apple, atlassian, zoom, stripe, shopify.
- Codici di tracciamento pubblici: usi trackingId per trovare gli altri negozi che condividono lo stesso codice. Passi un valore singolo come GTM-ABC123, AW-123456789, G-ABCDEF1234, UA-1234567-1 o ca-pub-1234567890123456. I codici numerici vogliono il tipo davanti: meta:123456789012345, tiktok:…, pinterest:…, microsoftAds:…, linkedin:…, hotjar:…, criteo:…, snapchat:…, clarity:…, klaviyo:… (Klaviyo distingue maiuscole e minuscole). Ogni altro valore restituisce 400 invalid_parameter. Ogni risultato contiene anche trackingIds (null finché il negozio non è stato letto).
- hasDecisionMaker=true|false (almeno un dirigente noto, o nessuno) e hasDecisionMakerEmail=true (almeno un dirigente la cui email è stata trovata sul sito o accettata dal server di posta). Qualsiasi altro valore restituisce 400 invalid_parameter. Ogni risultato include anche hasDecisionMaker.
- Pagina successiva: passi il valore di nextCursor nel parametro cursor. All'ultima pagina, nextCursor vale null.
- Ogni negozio restituito conta nel Suo budget negozi. Una pagina di 50 risultati consuma 50 negozi.
- Ogni risultato è un riepilogo del negozio: dominio, piattaforma, paese, tema, numero di prodotti, app, traffico, nome del commerciante, voto e categoria Google, hasEmail, hasPhone, hasDecisionMaker, currency, lang, operatorCountry, isActiveShop. Ogni risultato include anche audience (null se il negozio non è in classifica nel Chrome UX Report). Ogni risultato include anche dns (null finché il negozio non è stato letto). Per la scheda completa, chiama /v1/stores/:domain.
curl -G https://api.ecommerce-leads-database.com/v1/stores/search \
-H "X-API-Key: eldb_live_…" \
-d platform=shopify \
-d minProducts=50 \
-d hasGmb=true \
-d limit=50
{
"items": [
{ "domain": "…", "platform": "shopify", "productCount": …, "merchantName": "…", … }
],
"nextCursor": "18450:01J…"
}/v1/stores/:domainScheda di un negozio
Restituisce la scheda completa di un negozio. Costa 1 richiesta e 1 negozio. Il catalogo non è incluso: usa /catalog. Ogni email è restituita con il suo tipo; aggiungi genericEmailsOnly=true per ricevere solo caselle generiche. genericEmailsOnly=true nasconde anche le email dei dirigenti.
| Campo | Contenuto |
|---|---|
domain | Nome di dominio del negozio. |
platform | Piattaforma e-commerce rilevata (shopify, woocommerce…). |
tld | Estensione del dominio. |
country | Paese (codice ISO). |
theme | Tema rilevato. |
productCount | Numero di prodotti rilevati. |
verificationStatus | Esito dell'ultimo controllo del sito. |
lastSuccessAt | Data dell'ultimo controllo riuscito. |
firstSeenAt | Data di ingresso del negozio nel database. |
detectedApps | App e strumenti rilevati sul sito. |
traffic | Stima del traffico mensile e delle parole chiave organiche. |
audience | Audience su Chrome: { chromeRank, class, country, month, source }. chromeRank è la fascia della classifica del Chrome UX Report (Google) per quel paese: 1000, 5000, 10000, fino a 50000000. null se il negozio non è in classifica. Questo campo è condiviso con licenza CC BY-SA 4.0: citate la fonte e mantenete la stessa licenza. Valori di class: top_1k, top_5k, top_10k, top_50k, top_100k, top_500k, top_1m, top_5m, top_10m, top_50m. Fonte del Chrome UX Report: https://developer.chrome.com/docs/crux. Licenza: https://creativecommons.org/licenses/by-sa/4.0/. Dati adattati: posizioni abbinate ai negozi e raggruppate per paese da noi. |
dns | DNS: { mailProvider, dmarcPolicy, apps, checkedAt }. mailProvider è il fornitore di posta ricavato dall'MX (google-workspace, microsoft-365, ovh, infomaniak, ionos, gandi, zoho, proton, o2switch, hostinger, other, none). dmarcPolicy vale none, quarantine, reject o missing (nessun record). apps elenca gli strumenti di invio email e di verifica del dominio letti nei record SPF e TXT. checkedAt è la data della lettura. null finché il negozio non è stato letto. Nessun token di verifica viene esposto. |
trackingIds | trackingIds: codici di tracciamento e di pubblicità pubblici raggruppati per tipo, per esempio { "gtm": ["GTM-ABC123"], "googleAds": ["AW-123456789"], "meta": ["123456789012345"] }. Tipi: ga4, ua, gtm, googleAds, floodlight, adsense, meta, tiktok, pinterest, microsoftAds, linkedin, snapchat, criteo, clarity, hotjar, klaviyo. {} se non è stato trovato nulla, null finché il negozio non è stato letto. Solo i codici che qualsiasi visitatore vede nel sorgente della pagina. |
platformVersion | Versione della piattaforma (PrestaShop, Magento, Odoo) quando il sito la mostra. |
operator | Paese dell'azienda dietro il negozio ({ country, source }): dalla partita IVA, dalle impostazioni Shopify, dall'indirizzo delle note legali, dal telefono o dall'estensione, in quest'ordine. Può differire dall'estensione. |
isActiveShop | false quando il negozio sembra inattivo (catalogo vuoto, prodotti demo, valuta predefinita), con i motivi in activeShopReasons. null finché non è valutato. |
legal | Pagina delle note legali: pageUrl, companyIds (SIREN, IVA, numero d'impresa BE, IDI CH, verificati con la cifra di controllo), legalForm. |
shopify | Negozi Shopify: shopId, isPlus, shipsToCountries, shopPayInstallments, collectionsCount, themeStoreId. |
catalogStats | Dati del catalogo quando la piattaforma li espone: prezzo e peso medi, varianti, immagini, marchi, tipi di prodotto, categorie, data del prodotto più recente. |
metadata | merchantName; contactEmail con contactEmailType (generic, personal o unknown) ed emailDomainMatch; telephone (E.164) con phoneType (mobile, fixed_line…); address; socialLinks; sources (pagina e data di raccolta di ogni contatto); title, metaDescription, lang, currency, hreflangs, features, paymentMethods, shippingCarriers, salesChannels, copyrightYear, contactPageUrl, canonicalUrl. Un contatto raccolto più di 12 mesi fa, o un'email il cui titolare si è opposto, è null con il motivo in contactEmailWithheld, telephoneWithheld o addressWithheld. |
emails | Tutte le email pubblicate dal negozio: [{ email, type, sourceUrl }]. type vale generic, personal o unknown; sourceUrl è la pagina in cui l'email è stata letta. Al massimo 10, la migliore per prima. Un'email letta più di 12 mesi fa, o rimossa dal suo titolare, non viene restituita. Con genericEmailsOnly=true restano solo le email generic. |
decisionMakers | Dirigenti: [{ firstName, lastName, role, source, sourceUrl, since, email, emailStatus }], il dirigente principale per primo. role: owner (titolare, imprenditore individuale), president (presidente), managing_director (direttore generale), manager (gerente, amministratore unico), publication_director (responsabile della pubblicazione), partner (socio), administrator (consigliere di amministrazione), other. source: rne (registro nazionale delle imprese, Francia), zefix (registro di commercio, Svizzera) o legal_page (note legali del negozio). sourceUrl: la scheda pubblica dell'impresa nel registro, oppure la pagina delle note legali. since: data di inizio della carica quando il registro la fornisce, altrimenti null. emailStatus: found_on_site (indirizzo pubblicato sul sito), valid (accettato dal server di posta del dominio), catch_all (il server accetta tutti gli indirizzi: formato più probabile, non confermato), pattern (ricavato dal formato degli indirizzi del dominio, non verificato), not_found (nessun indirizzo accettato dal server), null (nessun indirizzo noto). email vale null se il titolare l'ha rimossa, se ha più di 12 mesi, o con genericEmailsOnly=true. Un dirigente letto più di 12 mesi fa non viene più restituito. Mai data di nascita, nazionalità o indirizzo personale. |
company | Scheda del registro delle imprese: { registry, registryId, officialName, activityCode, headcountBand, createdOn, category, legalFormCode, active, hq, checkedAt }. registry vale fr, be o ch; registryId è il SIREN, il numero d'impresa belga o l'IDI svizzero. officialName: denominazione ufficiale. activityCode: codice di attività (NAF o NACE). headcountBand: fascia di dipendenti, per esempio "10-19". createdOn: data di costituzione. category: categoria d'impresa (Francia). legalFormCode: codice della forma giuridica nel registro. active: false se l'impresa è cessata. hq: CAP e comune della sede. checkedAt: data dell'ultima lettura del registro. Un campo che il registro non fornisce vale null. company vale null se il negozio non ha un numero d'impresa, se il registro non lo conosce, o se la lettura ha più di 12 mesi. |
gmb | Scheda Google: placeId, category, additionalCategories, rating, ratingDistribution, isClaimed, totalPhotos, workTime, address, addressInfo, latitude, longitude, phone, website. null se non esiste. |
curl https://api.ecommerce-leads-database.com/v1/stores/probikeshop.fr \
-H "X-API-Key: eldb_live_…"
{
"store": {
"domain": "probikeshop.fr",
"platform": "shopify",
"tld": "fr",
"country": "FR",
"theme": "…",
"productCount": 5000,
"verificationStatus": "…",
"lastSuccessAt": "…",
"detectedApps": ["…"],
"trackingIds": { "gtm": ["GTM-ABC123"], "googleAds": ["AW-123456789"] },
"operator": { "country": "FR", "source": "vat" },
"isActiveShop": true,
"legal": { "pageUrl": "…", "companyIds": { "siren": "…", "vat": "…" }, "legalForm": "SAS" },
"metadata": {
"merchantName": "…",
"contactEmail": "…",
"contactEmailType": "generic",
"contactEmailWithheld": null,
"telephone": "+33…",
"phoneType": "fixed_line",
"address": { … },
"sources": {
"contactEmail": { "url": "https://…/mentions-legales", "at": "2026-10-19T08:00:00.000Z" }
},
"socialLinks": { "instagram": "…" },
"currency": "EUR",
"lang": "fr"
},
"emails": [
{ "email": "contact@…", "type": "generic", "sourceUrl": "https://…/contact" }
],
"decisionMakers": [
{
"firstName": "Marie", "lastName": "Durand", "role": "president",
"source": "rne", "sourceUrl": "https://annuaire-entreprises.data.gouv.fr/entreprise/…",
"since": "2019-03-01", "email": "marie.durand@…", "emailStatus": "valid"
}
],
"company": {
"registry": "fr", "registryId": "…", "officialName": "…",
"activityCode": "47.91B", "headcountBand": "10-19", "createdOn": "…",
"category": "PME", "legalFormCode": "5710", "active": true,
"hq": "…", "checkedAt": "…"
},
"gmb": {
"placeId": "…", "category": "…", "rating": 4.5, "votes": 594,
"address": "…", "phone": "…", "website": "…"
}
}
}/v1/stores/:domain/catalogPro e ScaleCatalogo prodotti
Restituisce i prodotti del negozio, al massimo 5.000. Disponibile per una parte dei negozi Shopify e WooCommerce. Altrimenti, errore 404 no_catalog, non addebitato. Costa 10 richieste.
curl https://api.ecommerce-leads-database.com/v1/stores/probikeshop.fr/catalog \
-H "X-API-Key: eldb_live_…"
{
"domain": "probikeshop.fr",
"catalog": [
{
"id": "…", "title": "…", "handle": "…", "vendor": "…",
"productType": "…", "tags": ["…"],
"price": …, "compareAtPrice": …, "currency": "EUR",
"available": true, "imageUrl": "…", "imageCount": …, "variantCount": …,
"createdAt": "…", "updatedAt": "…"
}
]
}/v1/stores/:domain/trendPro e ScaleAndamento del traffico
Restituisce lo storico mensile del traffico organico e dei posizionamenti. Errore 404 no_trend se non ci sono dati, non addebitato. Costa 2 richieste.
curl https://api.ecommerce-leads-database.com/v1/stores/probikeshop.fr/trend \
-H "X-API-Key: eldb_live_…"
{
"domain": "probikeshop.fr",
"trend": [
{ "date": "2026-07-01", "organicTraffic": 197021, "organicPositions": 19377 }
],
"savedAt": "2026-07-01T04:12:08.441Z"
}Arricchisca con le Sue chiavi
Trovi l'email e il telefono dei dirigenti di un negozio con il Suo account Apollo, FullEnrich, Kaspr o Dropcontact. La chiamata usa i Suoi crediti presso il fornitore. I risultati sono Suoi: nessun altro cliente li vede.
Salvi le Sue chiavi dei fornitori nel Suo account, alla pagina Le mie chiavi dei fornitori. Non passano mai dall'API: una chiave ELDB rubata non permette né di leggerle né di cambiarle.
Per richiesta: 25 negozi e 3 dirigenti per negozio. Per cliente: 3 arricchimenti in corso, e 500 persone per fornitore al giorno (UTC). Un risultato è servito per 12 mesi, poi cancellato a 13 mesi.
/v1/enrichment/providersI Suoi fornitori
Elenca i fornitori con una chiave salvata, con lo stato e i crediti rimasti quando il fornitore li comunica. Gratis.
curl https://api.ecommerce-leads-database.com/v1/enrichment/providers \
-H "X-API-Key: eldb_live_…"
{
"providers": [
{ "provider": "dropcontact", "status": "valid", "creditsRemaining": 250 }
]
}/v1/enrichmentsAvviare un arricchimento
Invii provider e domain (un negozio) o domains (25 al massimo). maxPeoplePerStore: da 1 a 3, 2 di default. phones: true per chiedere anche i telefoni (più crediti). force: true per rilanciare una persona arricchita meno di 30 giorni fa. Costa 1 richiesta e 1 negozio per ogni negozio con dirigenti. Risponde 200 con i risultati quando il fornitore risponde subito, altrimenti 202: segua il job.
curl -X POST https://api.ecommerce-leads-database.com/v1/enrichments \
-H "X-API-Key: eldb_live_…" \
-H "Content-Type: application/json" \
-d '{ "provider": "dropcontact", "domains": ["probikeshop.fr"], "maxPeoplePerStore": 2 }'
HTTP/1.1 202 Accepted
{
"job": {
"id": "…", "provider": "dropcontact", "status": "queued", "phones": false,
"storeCount": 1, "personCount": 2, "creditsUsed": null, "errorCode": null,
"createdAt": "…", "updatedAt": "…"
},
"results": [
{ "domain": "probikeshop.fr", "status": "ok", "people": [ … ] }
]
}/v1/enrichments/:jobIdSeguire un arricchimento
Restituisce lo stato del job (queued, submitted, done, partial, failed, canceled) e i risultati per negozio. Gratis. Aspetti almeno 20 secondi tra due chiamate.
curl https://api.ecommerce-leads-database.com/v1/enrichments/<jobId> \ -H "X-API-Key: eldb_live_…"
/v1/stores/:domain/enrichmentRisultati di un negozio
Restituisce la piattaforma, il nome del commerciante, i dirigenti, i Suoi fornitori e i Suoi risultati. Costa 1 richiesta e 1 negozio. DELETE sullo stesso URL cancella i Suoi risultati per questo negozio.
curl https://api.ecommerce-leads-database.com/v1/stores/probikeshop.fr/enrichment \
-H "X-API-Key: eldb_live_…"
{
"domain": "probikeshop.fr",
"platform": "…",
"merchantName": "…",
"providers": ["dropcontact"],
"decisionMakers": [{ "firstName": "…", "lastName": "…", "role": "president" }],
"results": [
{
"firstName": "…", "lastName": "…", "role": "president", "provider": "dropcontact",
"status": "found", "skipReason": null,
"email": "…", "emailStatus": "valid", "emailStatusRaw": "nominative@pro", "emailKind": "professional",
"phone": null, "phoneType": null, "linkedinUrl": "…", "jobTitle": "…",
"creditsUsed": 1, "errorCode": null, "enrichedAt": "…", "reused": false
}
]
}Ogni risultato contiene firstName, lastName, role, provider, status (pending, found, not_found, skipped, error), skipReason, email, emailStatus (valid, risky, catch_all, invalid, unknown), emailStatusRaw (l'etichetta del fornitore), emailKind (professional, generic, personal), phone, phoneType, linkedinUrl, jobTitle, creditsUsed, errorCode, enrichedAt e reused (true: un risultato già ottenuto, senza nuovi crediti).
GET /v1/stores/:domain restituisce anche enrichment: i Suoi risultati per questo negozio, accanto a decisionMakers. Array vuoto se non ne ha.
Quote e costi
Ogni piano ha due contatori: le richieste e i negozi. Si azzerano a ogni rinnovo dell'abbonamento.
Le inviamo un'email quando ha usato l'80% di un contatore.
- Starter (49 € IVA esclusa): 5.000 richieste e 2.500 negozi al mese. 1 database di piattaforma a scelta.
- Pro (149 € IVA esclusa): 25.000 richieste e 10.000 negozi al mese. 3 database a scelta. Catalogo e andamenti.
- Scale (449 € IVA esclusa): 150.000 richieste e 40.000 negozi al mese. Tutti i database. Catalogo e andamenti.
Il budget negozi conta ogni negozio restituito da /v1/stores/search e 1 negozio per ogni chiamata a /v1/stores/:domain. /v1/stores/count e /v1/me non consumano negozi.
Gli errori 404, 403 e 409 non vengono addebitati.
| Endpoint | Richieste | Negozi |
|---|---|---|
/v1/sample | 0 | 0 |
/v1/me | 0 | 0 |
/v1/stores/count | 1 | 0 |
/v1/stores/search | 1 | 1 per negozio restituito |
/v1/stores/:domain | 1 | 1 |
/v1/stores/:domain/catalog | 10 | 0 |
/v1/stores/:domain/trend | 2 | 0 |
/v1/enrichment/providers | 0 | 0 |
POST /v1/enrichments | 1 | 1 per negozio con dirigenti |
/v1/enrichments/:jobId | 0 | 0 |
/v1/stores/:domain/enrichment | 1 | 1 |
Header di risposta
X-RateLimit-Limit: richieste incluse questo mese.X-RateLimit-Remaining: richieste rimanenti.X-RateLimit-Reset: data dell'azzeramento, al rinnovo dell'abbonamento.X-Stores-Limit: negozi inclusi questo mese.X-Stores-Remaining: negozi rimanenti.
Errori
Un errore restituisce un codice HTTP e un JSON con un campo error.
| HTTP | Codice | Significato |
|---|---|---|
| 400 | invalid_parameter | Un parametro non è valido, ad esempio limit fuori dall'intervallo da 1 a 100. |
| 401 | missing_api_key | Nessuna chiave inviata. |
| 401 | invalid_api_key | Chiave sconosciuta o revocata. |
| 402 | active_subscription_required | Nessun abbonamento attivo su questo account. |
| 402 | plan_upgrade_required | Endpoint non incluso nel Suo piano (reason: exports_not_in_plan). Catalogo e andamenti richiedono Pro o Scale. |
| 403 | plan_restriction | Piattaforma fuori dai Suoi database (reason: platform_locked). Il campo allowed elenca i Suoi database. |
| 404 | not_found | Dominio sconosciuto. |
| 404 | no_catalog | Nessun catalogo per questo negozio. |
| 404 | no_trend | Nessun andamento per questo negozio. |
| 409 | no_database_selected | Scelga prima i Suoi database nel Suo account. |
| 429 | quota_exceeded | Quota di richieste esaurita fino a resetAt. |
| 429 | store_quota_exceeded | Budget negozi esaurito fino a resetAt. |
| 429 | rate_limited | Troppe chiamate in poco tempo. Attenda il tempo indicato nell'header Retry-After. |
| 429 | platform_change_limited | Cambio di database limitato a 1 ogni 30 giorni. |
| 400 | too_many_stores | Più di 25 negozi in un arricchimento. |
| 402 | provider_out_of_credits | Il Suo account presso il fornitore ha esaurito i crediti. |
| 404 | provider_not_available | Questo fornitore non è aperto all'arricchimento. |
| 409 | provider_key_missing | Nessuna chiave salvata per questo fornitore. |
| 422 | provider_key_invalid | Il fornitore ha rifiutato la Sua chiave. La sostituisca nel Suo account. |
| 422 | provider_plan_has_no_api | Il Suo piano presso il fornitore non dà accesso all'API. |
| 429 | byok_open_jobs | Ci sono già 3 arricchimenti in corso. Aspetti che uno finisca. |
| 429 | byok_daily_cap | Oggi sono già state inviate 500 persone a questo fornitore. Riprovi domani. |
| 429 | provider_rate_limited | Il fornitore chiede di rallentare. Il job riprende da solo. |
| 502 | provider_unavailable | Il fornitore non risponde. Il job riprova da solo. |
| 503 | opt_out_unavailable | Una pausa di qualche minuto: la verifica delle opposizioni non risponde. Non viene inviato nulla. |
Esempio di risposta quando il budget negozi è esaurito:
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 25000
X-RateLimit-Remaining: 0
X-Stores-Limit: 10000
X-Stores-Remaining: 0
{
"error": "store_quota_exceeded",
"plan": "api_pro",
"quotaMonthly": 25000,
"quotaUsed": …,
"storesMonthly": 10000,
"storesUsed": 10000,
"resetAt": "…"
}Server MCP
Colleghi il Suo agente IA (Claude, Cursor…) al database. Stessa chiave, stesse quote. Il server offre 8 strumenti:
search_stores: cercare negozi con filtri.count_stores: contare i negozi.get_store: leggere la scheda di un negozio.get_store_catalog: leggere il catalogo (Pro e Scale).get_store_trend: leggere l'andamento del traffico (Pro e Scale).enrich_store: arricchire i dirigenti di uno o più negozi con la Sua chiave del fornitore.get_enrichment: seguire un arricchimento, leggere i risultati di un negozio o elencare i Suoi fornitori.get_quota: vedere il Suo piano e la quota rimanente.
Claude Code
claude mcp add eldb --transport http https://mcp.ecommerce-leads-database.com/mcp \ --header "X-API-Key: eldb_live_…"
Cursor e client compatibili (JSON)
Per un client che accetta un server HTTP remoto con header, come Cursor (file mcp.json):
{
"mcpServers": {
"eldb": {
"url": "https://mcp.ecommerce-leads-database.com/mcp",
"headers": {
"Authorization": "Bearer eldb_live_…"
}
}
}
}Claude Desktop: usi il bridge mcp-remote, in claude_desktop_config.json:
{
"mcpServers": {
"eldb": {
"command": "npx",
"args": [
"-y", "mcp-remote", "https://mcp.ecommerce-leads-database.com/mcp",
"--header", "Authorization: Bearer eldb_live_…"
]
}
}
}La chiave va sempre in un header. Non la inserisca mai nell'URL.
Esempi di codice
Elencare tutti i negozi Shopify che hanno una scheda Google, pagina per pagina.
JavaScript (fetch)
const API = "https://api.ecommerce-leads-database.com";
const headers = { "X-API-Key": process.env.ELDB_API_KEY };
let cursor = null;
do {
const url = new URL("/v1/stores/search", API);
url.searchParams.set("platform", "shopify");
url.searchParams.set("hasGmb", "true");
url.searchParams.set("limit", "50");
if (cursor) url.searchParams.set("cursor", cursor);
const res = await fetch(url, { headers });
if (res.status === 429) {
console.log(await res.json()); // quota o budget esaurito: vedere resetAt
break;
}
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { items, nextCursor } = await res.json();
for (const store of items) console.log(store.domain);
console.log("Negozi rimanenti:", res.headers.get("X-Stores-Remaining"));
cursor = nextCursor;
} while (cursor);Python (requests)
import os
import requests
API = "https://api.ecommerce-leads-database.com"
headers = {"X-API-Key": os.environ["ELDB_API_KEY"]}
params = {"platform": "shopify", "hasGmb": "true", "limit": 50}
while True:
r = requests.get(f"{API}/v1/stores/search", headers=headers, params=params)
if r.status_code == 429:
print(r.json()) # quota o budget esaurito: vedere resetAt
break
r.raise_for_status()
data = r.json()
for store in data["items"]:
print(store["domain"])
print("Negozi rimanenti:", r.headers.get("X-Stores-Remaining"))
if not data["nextCursor"]:
break
params["cursor"] = data["nextCursor"]