Monitoraggio gare d'appalto
Consegna automatica delle nuove gare d'appalto in base ai vostri filtri — regione, tag di settore, parole chiave, intervallo di valore. Pull API + digest email + webhook.
Concetti
Quattro termini che si incontrano in tutti gli endpoint:
- Tender — una specifica gara d'appalto proveniente dal portale (NEN, VVZ, E-ZAK, TenderArena, ecc.). Identificata da un ID numerico.
- Filter — insieme salvato di criteri (regione, settore, parole chiave, valore). Quando una nuova gara soddisfa i criteri, viene generato un match.
- Match — nuova gara d'appalto rientrata nel tuo filtro. Rappresenta l'associazione (tender × filter) + timestamp + il tuo stato (monitorata / nascosta / letta).
- Taxonomy — nomenclatori di regioni (NUTS), settori (industry tag) e codici CPV, in base ai quali classifichiamo le gare d'appalto.
Avvio rapido
I filtri possono essere configurati in due modi — il risultato è lo stesso e il filtro può essere modificato in qualsiasi momento con qualsiasi metodo.
curl -H "X-Api-Key: mrw_live_…" \ "https://veritra.io/api/v2/leads/tenders/search?qText=rekonstrukce%20mostu&limit=5"
In alto è disponibile la ricerca ad-hoc. Se si desidera un monitoraggio continuativo (nuove gare corrispondenti ai propri criteri), utilizzare i filtri + webhook/email digest — vedere di seguito.
Ricerca di gare d'appalto (ad-hoc)
Per la ricerca una tantum di gare d'appalto su tutte le gare attive. Non utilizza un filtro salvato; i parametri vengono passati direttamente nella query string.
/api/v2/leads/tenders/searchParametri di query
| Parametro | Tipo | Descrizione |
|---|---|---|
| qText* | string | Testo ricercato (full-text su titolo + descrizione). |
| regions | string | CSV di codici NUTS foglia (CZ010,CZ020). |
| cpvPrefixes | string | CSV di prefissi CPV (45,452). |
| industryTags | string | CSV di ID tag di settore (con_buildings,it_development). |
| minValue | number | Valore stimato minimo (CZK). Le gare prive di valore vengono comunque elaborate. |
| maxValue | number | Valore stimato massimo (CZK). Le gare prive di valore vengono comunque elaborate. |
| deadlineFrom | string (YYYY-MM-DD) | Termine di presentazione >= YYYY-MM-DD. |
| deadlineTo | string (YYYY-MM-DD) | Termine di presentazione <= YYYY-MM-DD. |
| sort | "newest" | "deadline" | "value" | Ordinamento: newest (predefinito), deadline (crescente), value (decrescente). |
| limit | number | Numero di risultati, max 1000 (predefinito: 50). Per >1k utilizza la paginazione nextCursor o /matches/export. |
| cursor | string | Cursore keyset dalla pagina precedente (pagination.nextCursor). |
Esempio
curl -H "X-Api-Key: mrw_live_…" \ "https://veritra.io/api/v2/leads/tenders/search?qText=rekonstrukce®ions=CZ010,CZ020&minValue=500000&limit=10"
/api/v2/leads/tenders/:idResponse: oggetto data con i campi id, title, description, estimatedValue, deadlineAt, contractingAuthority, documents[], starred, excluded.
/api/v2/leads/tenders/:id/emailIl body può contenere recipientEmail per l'inoltro a un altro indirizzo e-mail. Di default viene utilizzato user.email.
/api/v2/leads/documents/previewQuery: ?url=:original&kind=docx|xlsx. Allowlist degli host: NEN, E-ZAK, Tender Arena, Gemin, ProfilZadavatele.
GET /api/v2/leads/documents/preview?url=https://nen.nipez.cz/…/Vyzva.docx&kind=docx → 302 Location: https://rwx-storage…/Tendero/doc-cache-v8/<hash>.html (signed, TTL 10 min)
Catalog & autocomplete (pubblico, nessuna chiave)
Per i dropdown dell'interfaccia utente e la creazione di filtri. Cache server-side di 1h. Pubblico, nessuna autenticazione necessaria.
/api/v2/leads/zadavatele?q=praha/api/v2/leads/countries/api/v2/leads/regions?country=CZ/api/v2/leads/regions/catalog?country=CZ&locale=cs/api/v2/leads/taxonomy/industry/api/v2/leads/taxonomy/cpvCosa si può filtrare e valori consentiti
Il filtro è composto dai campi seguenti. Tutti sono facoltativi ad eccezione di `name`. Campo vuoto = nessuna restrizione nella dimensione corrispondente.
regions string[]
Regioni NUTS per il paese specificato (?country=CZ) con etichette per lingua.
CZČeská republikaSKSlovenskoPLPolskoDENěmeckoATRakouskoFRFrancieESŠpanělskoITItálieNLNizozemskoBEBelgiePTPortugalskoSEŠvédskoFIFinskoDKDánskoNONorskoIEIrskoGRŘeckoRORumunskoBGBulharskoHUMaďarskoHRChorvatskoSISlovinskoLTLitvaLVLotyšskoEEEstonskoLULucemburskoCYKyprMTMaltaCHŠvýcarskoISIslandMKSeverní MakedoniePer ottenere l'albero NUTS completo di un paese specifico, utilizzare:
GET /api/v2/leads/regions/catalog?country=CZ&locale=cs GET /api/v2/leads/regions/catalog?country=DE&locale=de GET /api/v2/leads/regions/catalog?country=FR&locale=en
Esempio: codici NUTS-3 per CZ (regioni) — espandi ▸
CZ010Hlavní město PrahaCZ020Středočeský krajCZ031Jihočeský krajCZ032Plzeňský krajCZ041Karlovarský krajCZ042Ústecký krajCZ051Liberecký krajCZ052Královéhradecký krajCZ053Pardubický krajCZ063Kraj VysočinaCZ064Jihomoravský krajCZ071Olomoucký krajCZ072Zlínský krajCZ080Moravskoslezský krajindustryTags string[] Consigliato
Classificazione settoriale multi-tag. Una gara può avere più tag (es. 'stav_pozemni' + 'stav_remesla' per una ristrutturazione). Il filtro seleziona la gara se presenta almeno uno dei tag specificati (JSON_OVERLAPS).
Perché preferire industryTags rispetto al CPV: I nostri industryTags sono generati dalla combinazione della classificazione LLM del titolo/descrizione della gara + mappatura CPV + hint regex — intercettano le gare rilevanti anche per le stazioni appaltanti che assegnano i codici CPV in modo approssimativo. Il filtro CPV è preciso, ma dipende dalla disciplina della stazione appaltante, che in Italia è spesso carente.
con_buildingsBuilding construction and renovationcon_civilCivil engineering (roads, bridges, water)con_tradesConstruction trades and subworkscon_energy_efficiencyEnergy savings & renewablescon_materialsConstruction materialsdes_documentationDesign documentation and studiesdes_supervision_ohsSite supervision and OHSdes_surveyingSurveying and land consolidationit_developmentSoftware development and integrationit_licensingSoftware licences and subscriptionsit_hardwareHardware and infrastructureit_cybersecurityCybersecurityit_data_aiData, analytics, AI/MLtelecom_internetTelecom, internet, mobileprof_marketingMarketing, PR, advertisingprof_legalLegal servicesprof_accountingAccounting, grants, auditprof_hrHR, recruitmentprof_translationTranslation and interpretingprof_insuranceInsurance and financeops_cleaningCleaning servicesops_securitySecurity and receptionops_maintenanceEquipment maintenance and serviceops_wasteWaste managementops_facilityProperty managementcat_cateringCatering servicescat_accommodationAccommodation and conferencescat_foodFood and beveragestrans_transportPassenger and freight transporttrans_vehiclesVehicles, parts, leasinghealth_pharmaPharmaceuticalshealth_devicesMedical devices and supplieshealth_careHealth and social caregoods_furnitureFurniture and interiorsgoods_clothingClothing, PPE, uniformsgoods_electricalElectrical materialgoods_machineryIndustrial machineryenergy_fuelsFuelsenergy_power_heatElectricity and heatenergy_waterWater utilitiesnat_forestryForestrynat_greeneryGreenery maintenance and gardeningnat_agricultureAgriculturedefense_safetyFire, military, defencesci_labLab and measurement equipmentsci_researchResearch and developmentedu_trainingEducation and trainingculture_mediaCulture, books, mediacategories string[] Meno preciso
Prefissi CPV (Common Procurement Vocabulary) di lunghezza arbitraria — corrispondenza tramite `LIKE 'prefix%'`. Ovvero '45' intercetta tutte le divisioni edili, '4523' solo le costruzioni di ingegneria civile, '45316110' solo l'illuminazione stradale.
03Agricoltura, silvicoltura e pesca09Combustibili ed energia15Alimenti e bevande18Abbigliamento, calzature, DPI22Stampati e libri30Macchine per ufficio e apparecchiature IT31Macchine elettriche, cavi e apparecchi di illuminazione32Radio, TV e telecomunicazioni33Attrezzature medicali e farmaci34Veicoli e trasporti35Sicurezza, antincendio e tecnologia militare38Strumenti di laboratorio e di misura39Mobili e arredamento per interni42Macchine industriali44Materiali e strutture edili45Lavori edili48Software e licenze50Riparazioni e manutenzione55Ristorazione e alloggio60Trasporti64Servizi postali e di telecomunicazione65Servizi di pubblica utilità (elettricità, acqua)66Servizi finanziari e assicurativi70Servizi immobiliari e gestione edifici71Servizi architettonici, progettuali e ingegneristici72Servizi IT (sviluppo, integrazione, supporto)73Ricerca e sviluppo75Pubblica amministrazione e difesa77Servizi agricoli, forestali e di giardinaggio79Servizi professionali (legale, contabilità, HR, marketing)80Istruzione e formazione85Assistenza sanitaria e sociale90Rifiuti, ambiente e pulizie92Cultura, sport e tempo libero98Altri servizi alla personaIl catalogo completo (9.454 codici) è disponibile su /docs/leads/cpv — ricercabile e raggruppato per divisioni.
keywords string[]
Corrispondenza LIKE nel titolo e nella descrizione della gara. Case-insensitive. Tra le voci OR. Utile come rete di sicurezza qualora industryTags/CPV non intercettino tutto (es. una tipologia specifica di appalto presente nel testo).
"keywords": ["ricostruzione", "VO", "illuminazione", "scuola materna"]
minValue / maxValue number | null
Intervallo del valore stimato dell'appalto in CZK. È possibile specificare solo minValue, solo maxValue o entrambi.
emailDigest boolean
Se impostato su true, si riceve 1 volta al giorno (ore 5:00 UTC) un'e-mail riepilogativa con le nuove corrispondenze di questo filtro. Valore predefinito: true. Può essere disattivato modificando il filtro. Il webhook si configura separatamente, a livello di account (vedi sezione seguente).
name string · active boolean
`name` — max 120 caratteri, obbligatorio. `active` — se false, il filtro non viene eseguito nel cron (nessuna nuova corrispondenza, digest, webhook). Può essere sospeso senza eliminazione.
Logica di filtraggio
I campi vengono combinati come segue:
MATCH = (stazione_appaltante.NUTS3 ∈ expand(regions))
AND (minValue ≤ estimatedValue ≤ maxValue OPPURE estimatedValue è null o 0)
AND (industry_or_cpv OPPURE keyword_match)
# expand(regions): i codici NUTS vengono espansi fino alle foglie NUTS 3
# (CZ → 14 regioni, CZ01 → CZ010, CZ010 → CZ010).
industry_or_cpv:
se industryTags specificati → JSON_OVERLAPS(industryTags, tender.industryTags)
altrimenti categories specificati → tender.cpvCode LIKE ANY (categories + "%")
altrimenti → false (nessun filtro settoriale applicato)
keyword_match:
se keywords specificati → tender.title o description LIKE ANY (%kw%)
altrimenti → false
# Se non vengono specificati industryTags / categories / keywords,
# vengono restituite tutte le gare che soddisfano regions e l'intervallo di valore.industryTags ha la precedenza su categories — se vengono specificati entrambi, viene utilizzato solo industryTags (categories viene ignorato). keywords funziona in modo indipendente (si trova nel ramo OR insieme a industry_or_cpv).
Endpoint per la gestione dei filtri
Per la gestione dei filtri, utilizzare la chiave di gestione (mrw_live_…). Dispone di limiti di frequenza separati e non consuma crediti LEADS, pertanto la gestione dei filtri non influisce sul recupero giornaliero degli appalti.
/api/v2/leads/filters/api/v2/leads/filters/api/v2/leads/filters/:id/api/v2/leads/filters/:id/api/v2/leads/filters/:id/api/v2/leads/filters/:id/matches/export?format=csv|xlsx|json&view=all|starred|excludedParametri body (POST / PUT) — comuni
| Parametro | Tipo | Descrizione |
|---|---|---|
| name* | string | Nome del filtro (max 120 caratteri) |
| regions | string[] | Codici NUTS (es. `CZ010`). È possibile combinare qualsiasi livello. Campo vuoto = tutte le regioni. |
| industryTags | string[] | Percorso consigliato. ID tag dalla nostra tassonomia (es. 'stav_pozemni', 'it_vyvoj'). Multi-tag — OR tra gli elementi. |
| categories | string[] | Prefissi CPV di lunghezza arbitraria (es. '45', '4523', '45316110'). Meno precisi rispetto agli industryTags. |
| keywords | string[] | Parole chiave — corrispondenza LIKE nel titolo e nella descrizione della gara (OR tra gli elementi). |
| minValue | number | null | Valore stimato minimo (CZK). Le gare prive di valore vengono comunque elaborate. |
| maxValue | number | null | Valore stimato massimo (CZK). Le gare prive di valore vengono comunque elaborate. |
| emailDigest | boolean | Digest e-mail giornaliero (default true) |
| active | boolean | Filtro attivo (default true) |
Il webhook non si configura più sul filtro — vedere la sezione Webhook di seguito (endpoint a livello di account). Campo webhookUrl viene rifiutato per motivi di sicurezza con HTTP 410.
Esempi
Costruzioni a Praga superiori a 500 mila CZK
curl -X POST -H "X-Api-Key: mrw_live_…" \
-H "Content-Type: application/json" \
-d '{
"name": "Costruzioni Praga 500k+",
"regions": ["CZ010"],
"industryTags": ["con_buildings", "con_trades"],
"minValue": 500000
}' \
https://veritra.io/api/v2/leads/filtersSviluppo IT e licenze SW (tutte le regioni)
curl -X POST -H "X-Api-Key: mrw_live_…" \
-H "Content-Type: application/json" \
-d '{
"name": "Sviluppo IT + licenze SW",
"industryTags": ["it_development", "it_licensing", "it_data_ai"],
"keywords": ["sistema informativo", "modulo"]
}' \
https://veritra.io/api/v2/leads/filtersIlluminazione pubblica (CZ) — combinazione di tag e parole chiave
curl -X POST -H "X-Api-Key: mrw_live_…" \
-H "Content-Type: application/json" \
-d '{
"name": "Illuminazione pubblica (CZ)",
"industryTags": ["goods_electrical", "con_civil"],
"keywords": ["illuminazione", "IP ", "illuminazione pubblica", "lampioni"],
"minValue": 200000
}' \
https://veritra.io/api/v2/leads/filtersDisattiva filtro
curl -X PATCH -H "X-Api-Key: mrw_live_…" \
-H "Content-Type: application/json" \
-d '{"active": false}' \
https://veritra.io/api/v2/leads/filters/<id>Consegna — webhook vs polling
Due modalità per ricevere nuove gare nel proprio ERP. La maggior parte degli integratori le combina entrambe.
Webhook (push)
Veritra invia una POST al tuo endpoint entro ~2 secondi dal match. Evento leads.match.created con il payload completo della gara.
Vantaggi: tempo reale, nessun overhead di polling, gating lato server.
Svantaggi: richiede un endpoint pubblicamente accessibile (HTTPS), verifica HMAC, gestione dell'idempotenza.
Polling (pull)
Il tuo ERP chiama GET /api/v2/leads/matches?since=… periodicamente (es. ogni 5 min). Restituisce i match a partire dal timestamp indicato.
Vantaggi: nessun endpoint pubblico, implementazione semplice, compatibile con i riavvii.
Svantaggi: latenza 5-10 min, vincolo di rate limit (60 req/min mgmt API), risposte vuote superflue.
Recupero dei match
/api/v2/leads/matchesParametri di query
| Parametro | Tipo | Descrizione |
|---|---|---|
| filterId | string | Filtra per filtro specifico |
| qText | string | Testo ricercato (full-text su titolo + descrizione). |
| since | string (ISO 8601 datetime) | Solo match a partire dalla data (ISO datetime) |
| delivered | boolean | false = solo non consegnati, true = solo consegnati |
| view | "starred" | "excluded" | Vista speciale: starred (preferiti) | excluded (nascosti). |
| sort | "newest" | "deadline" | "value" | Ordinamento: newest (predefinito), deadline (crescente), value (decrescente). |
| limit | number | Numero di risultati, max 1000 (predefinito: 50). Per >1k utilizza la paginazione nextCursor o /matches/export. |
| cursor | string | Cursore keyset dalla pagina precedente (pagination.nextCursor). |
I match restituiti vengono contrassegnati automaticamente come delivered=true. Ogni richiesta consuma 1 credito.
Formati di matchId
matchId ha due formati a seconda dell'origine:
cm…(prefisso cuid) — restituito dalla tabella LeadMatch pre-calcolata (cron job che abbina le gare ogni giorno). Stabile tra le chiamate, utilizzabile per mark-as-viewed.live-12345prefisso synthetic per match rilevato in tempo reale tramite search / browse mode (parametro qText, view=starred/excluded). Non presente nella tabella LeadMatch → mark-as-viewed è no-op. tenderId è il suffisso dopo il trattino.
Esempio
curl -H "X-Api-Key: mrw_leads_…" \ "https://veritra.io/api/v2/leads/matches?delivered=false&limit=10"
Risposta
{
"data": [
{
"matchId": "cm…",
"filterId": "cm…",
"filterName": "Costruzioni Praga",
"matchedAt": "2026-04-03T06:00:00.000Z",
"viewedAt": null,
"delivered": true,
"tender": {
"id": 12345,
"title": "Ricostruzione del ponte n. 123",
"estimatedValue": 12500000,
"deadlineAt": "2026-05-15T22:00:00.000Z",
"publishedAt": "2026-04-01T08:00:00.000Z",
"firstSeenAt": "2026-04-01T08:30:00.000Z",
"url": "https://nen.nipez.cz/...",
"portalType": "NEN",
"cpvCode": "45000000",
"tenderType": "OFFERS",
"contractingAuthority": {
"ico": "12345678",
"name": "Město Praha",
"region": "Praha",
"district": "Praha 1"
},
"documents": [
{ "name": "Výzva.pdf", "url": "https://nen.nipez.cz/…", "fileType": "pdf", "fileSizeBytes": 320000 }
],
"starred": false,
"excluded": false
}
}
],
"pagination": { "nextCursor": "eyJmaXJzdFNlZW5BdC…", "totalCount": 42 }
}Per la pagina successiva, inviare pagination.nextCursor come parametro ?cursor=.
Azioni sui match
Star (preferito), exclude (nascondi) e view (segna come letto) sono preferenze per-tender salvate in UserTenderPreference.
/api/v2/leads/matches/:matchIdResponse: stessa struttura dell'elemento della lista matches.
/api/v2/leads/matches/:matchId/star{ "starred": true }/api/v2/leads/matches/:matchId/exclude{ "excluded": true }/api/v2/leads/matches/:matchId/viewPer i match sintetici live-:id è un no-op (nessuna riga da contrassegnare).
/api/v2/leads/preferences{
"data": {
"starred": [12345, 67890],
"excluded": [54321]
}
}Tassonomia
Cataloghi di riferimento statici per i valori dei filtri. Etichette localizzate.
/api/v2/leads/taxonomy/industry?locale=cs{
"data": {
"locale": "cs",
"areas": [{ "id": "construction", "icon": "🏗️", "label": "Stavebnictví" }, …],
"tags": [
{ "id": "con_buildings", "area": "construction", "label": "Pozemní stavby", "cpvPrefixes": ["452"] },
…
]
}
}/api/v2/leads/taxonomy/cpv?locale=csRisposta: struttura ad albero divisioni → gruppi → classi → categorie → sottocategorie.
Webhook
Gli endpoint webhook (CRUD, rotazione del secret) sono a livello di account — documentati una sola volta in Account API → Webhook. Qui è descritto solo il payload dell'evento specifico per i lead (leads.match.created) e la verifica HMAC.
Consegna degli eventi
Ad ogni nuovo match inviamo un evento di tipo leads.match.created con firma HMAC-SHA256 nell'intestazione X-Signature-256, chiave di idempotenza in X-Idempotency-Key e tipo in X-Event-Type. In caso di errore, nuovo tentativo con backoff esponenziale fino a ~33 ore.
Policy di retry
Se il tuo endpoint restituisce un codice non-2xx (o non risponde entro 10s), Veritra riprova con exponential backoff: 1min, 5min, 30min, 2h, 12h, 24h. Dopo 6 fallimenti, il webhook viene contrassegnato come failed e lampeggia nella dashboard. L'Idempotency-key è la stessa per ogni tentativo — il tuo endpoint DEVE deduplicare (altrimenti lo stesso match viene elaborato 6 volte).
Gestione degli endpoint tramite API
È possibile gestire gli endpoint webhook senza accedere alla dashboard. Limite di 5 endpoint per account.
/api/v2/account/webhooks/api/v2/account/webhooks/api/v2/account/webhooks/:id/api/v2/account/webhooks/:id/api/v2/account/webhooks/:id/api/v2/account/webhooks/:id/rotate-secret/api/v2/account/webhooks/:id/test/api/v2/account/webhooks/:id/deliveries/api/v2/account/webhooks/:id/deliveries/:deliveryId/replayVerifica della firma HMAC
Il server firma il payload con HMAC-SHA256(secret, raw_body) e lo invia nell'intestazione X-Signature-256 nel formato sha256=hex. Verificare con un confronto in constant-time, altrimenti l'integrazione è vulnerabile a timing attack.
// Node.js (Express)
import crypto from "node:crypto";
const WEBHOOK_SECRET = process.env.MRICKWOOD_WEBHOOK_SECRET!;
function verify(rawBody: string, sig: string | undefined): boolean {
if (!sig) return false;
const expected = "sha256=" + crypto
.createHmac("sha256", WEBHOOK_SECRET)
.update(rawBody)
.digest("hex");
// Constant-time comparison (timing-safe)
const a = Buffer.from(sig);
const b = Buffer.from(expected);
return a.length === b.length && crypto.timingSafeEqual(a, b);
}
app.post("/webhooks/veritra",
express.raw({ type: "application/json" }),
async (req, res) => {
const raw = req.body.toString("utf8");
if (!verify(raw, req.header("X-Signature-256"))) {
return res.status(401).send("Invalid signature");
}
const idempKey = req.header("X-Idempotency-Key")!;
const evt = JSON.parse(raw);
// Idempotency: store idempKey, skip if already processed
if (await alreadyProcessed(idempKey)) return res.status(200).send("ok");
await processEvent(evt);
await markProcessed(idempKey);
res.status(200).send("ok"); // Must be 2xx within 10s
},
);# Python (Flask)
import hmac, hashlib, os
from flask import Flask, request, abort
WEBHOOK_SECRET = os.environ["MRICKWOOD_WEBHOOK_SECRET"]
def verify(raw: bytes, sig: str | None) -> bool:
if not sig: return False
expected = "sha256=" + hmac.new(
WEBHOOK_SECRET.encode(), raw, hashlib.sha256
).hexdigest()
return hmac.compare_digest(sig, expected)
@app.post("/webhooks/mrickwood")
def webhook():
raw = request.get_data()
if not verify(raw, request.headers.get("X-Signature-256")):
abort(401)
# ... idempotency check + process
return "ok", 200{
"id": "evt_…",
"type": "leads.match.created",
"createdAt": "2026-04-03T06:00:00.000Z",
"data": {
"filterId": "cm…",
"filterName": "Costruzioni Praga",
"matchId": "cm…",
"tender": { "id": "12345", "title": "…", "estimatedValue": 12500000 }
}
}Email digest
Con emailDigest: true riceverete un'email giornaliera con il riepilogo delle nuove gare d'appalto. Il digest viene inviato al mattino (5:00 UTC) all'indirizzo email del vostro account. Può essere disattivato modificando il filtro.
Limiti
| Parametro | Tipo | Descrizione |
|---|---|---|
| Trial | 500 req/mese | 1 giorno gratuito. Senza carta di credito / profilo di fatturazione. Default ApiKey.requestsLimit. |
| Piano a pagamento | illimitato | Il limite mensile è disabilitato. Si applica solo il rate limit tecnico di 100/h/chiave. |
| Filtri | 20 | Numero massimo di filtri attivi per account. |
| Endpoint webhook | 5 | Numero massimo di URL webhook attivi per account. |
Al superamento del limite mensile, l'API restituisce 429 con l'intestazione Retry-After. Il limite viene azzerato il 1° giorno del mese.