GET/v1/health
Se l’API è attiva. Pubblica: nessuna chiave, nessun dato, nessun accesso al database.
Advanta interroga questa route ogni 5 minuti; i risultati sono sulla pagina di stato pubblica.
curl -s "$BASE/v1/health"Advanta / Banche e finanziatori / Sviluppatori
Il Suo sistema legge le richieste di finanziamento che Advanta Le assegna, invia le Sue decisioni, stabilisce che cosa richiede prima di finanziare, gestisce i Suoi limiti, invia il Suo estratto conto per la riconciliazione, invita i Suoi clienti e fornitori e riceve webhook firmati quando succede qualcosa. Ogni scrittura ha lo stesso effetto della stessa azione nel portale del finanziatore. E porta via tutti i Suoi dati, quando vuole: il Suo diritto di uscita.
Un solo URL di base serve allo stesso modo le chiavi live e sandbox: è la chiave a decidere che cosa si vede.
https://bzsengbmlzzhztjfvcag.supabase.co/functions/v1/funder-apiAuthorization: Bearer adv_fk_… a ogni chiamata: adv_fk_ seguito da 64 caratteri esadecimali.Inizi da GET /v1/me: indica a quale finanziatore appartiene la chiave, il suo ambiente e i suoi ambiti. Poi elenchi le richieste a Lei assegnate.
export ADVANTA_KEY="adv_fk_…" # your key, shown once when it was issued
export BASE="https://bzsengbmlzzhztjfvcag.supabase.co/functions/v1/funder-api"
# 1. Who am I: funder, environment, scopes
curl -s "$BASE/v1/me" \
-H "Authorization: Bearer $ADVANTA_KEY"
# 2. The requests routed to me that are still open
curl -s "$BASE/v1/requests?status=open&limit=20" \
-H "Authorization: Bearer $ADVANTA_KEY"// Node.js 18 or later, as an ES module (fetch and top-level await are built in)
const BASE = 'https://bzsengbmlzzhztjfvcag.supabase.co/functions/v1/funder-api';
const headers = { Authorization: `Bearer ${process.env.ADVANTA_KEY}` };
async function call(path) {
const res = await fetch(BASE + path, { headers });
const body = await res.json();
if (!res.ok) throw new Error(`${res.status} ${body.error.code}: ${body.error.message}`);
return body;
}
const me = await call('/v1/me');
console.log(me.environment, me.funder.name, me.key.scopes);
const { count, requests } = await call('/v1/requests?status=open&limit=20');
console.log(`${count} open request(s)`);
for (const r of requests) {
console.log(r.request_ref, r.status, r.total_amount, r.my_offer?.status ?? 'no offer yet');
}GET /v1/me risponde così:
{
"api_version": "2026-09-23",
"environment": "sandbox",
"funder": {
"bank_id": "6d164c92-02cc-4f9a-ae8d-3f7f5ef043d3",
"name": "Compartment Demo (LU)"
},
"key": {
"id": "0b3c6a52-5d0e-4b53-9d0e-1c2b3a4d5e6f",
"name": "sandbox · Example prospect",
"prefix": "adv_fk_1a2b3",
"scopes": ["requests:read", "limits:read", "webhooks:write"],
"created_at": "2026-09-23T18:00:00Z",
"expires_at": "2026-10-07T18:00:00Z",
"prospect": "Example prospect"
}
}C’è un solo URL di base. È la chiave a decidere l’ambiente, e GET /v1/me lo restituisce in environment.
| environment | Il finanziatore | Che cosa vede la chiave |
|---|---|---|
live | Classificato da Advanta come reale o pilota. | Solo clienti reali. |
sandbox | Un finanziatore dimostrativo. | Solo aziende fittizie, sul piano dimostrativo. |
unclassified | Non ancora classificato da Advanta. | Nessuna richiesta. |
Una richiesta dell’altro piano non è mai visibile, qualunque sia la chiave.
key.prospect in GET /v1/me). Come ogni chiave, è mostrata una sola volta e ne viene conservato solo lo SHA-256.key.expires_at); da quel momento ogni chiamata risponde 401 key_expired. Advanta può anche revocarla in qualsiasi momento.decisions:write. I segnalatori e i link del finanziatore dimostrativo sono condivisi da tutte le dimostrazioni.Può avere una chiave sandbox oggi: il Suo sistema sui nostri dati dimostrativi, prima di qualsiasi contratto. Scriva a diogo@advanta.pt. La chiave reale viene emessa il giorno in cui vuole collegarsi.
Ogni chiamata porta Authorization: Bearer adv_fk_<64 hex>. Le chiavi sono emesse dal team operativo di Advanta e appartengono a un finanziatore. Una chiave è mostrata una sola volta, ne viene conservato solo lo SHA-256 e può scadere.
Ogni chiave ha degli ambiti. Una chiamata per cui la chiave non ha l’ambito risponde 403 forbidden.
| Ambito | Che cosa consente |
|---|---|
requests:read | Leggere le richieste (GET /v1/requests, GET /v1/requests/{id} e i suoi documenti). Legge anche le Sue impostazioni e i documenti richiesti, i registri dei limiti, il profilo di pagamento, i Suoi clienti (segnalatori, link, inviti e rapporto), i Suoi link di onboarding, i Suoi endpoint dei webhook e i relativi registri di consegna. Legge anche le condizioni del Suo programma (GET /v1/programme), le richieste di regresso (GET /v1/recourse), i Suoi dati bancari (GET /v1/bank-data), e le notifiche di una richiesta e il flusso di cassa che il suo cedente condivide con Lei. |
limits:read | Leggere i registri dei limiti (GET /v1/credit-limits, GET /v1/seller-limits) e il profilo di pagamento. |
limits:write | Fissare, rivedere o rifiutare limiti (PUT /v1/credit-limits, PUT /v1/seller-limits). |
decisions:write | Offrire, rifiutare, finanziare e registrare incassi (POST /v1/requests/{id}/decision), e alzare ciò che i debitori di una richiesta devono firmare (POST /v1/requests/{id}/consent-level). Consente anche tutte le scritture su impostazioni, limiti, estratti conto, clienti, link di onboarding ed endpoint dei webhook, oltre alla lettura di endpoint dei webhook, clienti e link di onboarding. Consente anche di esportare tutti i Suoi dati. Consente anche di notificare una richiesta confidenziale (POST /v1/requests/{id}/announce), chiudere una richiesta di regresso (POST /v1/recourse/{id}/close) e cambiare le condizioni del Suo programma. |
settings:write | Cambiare ciò che i Suoi debitori devono firmare prima del finanziamento (PUT /v1/settings) e i documenti che richiede ai cedenti (PUT /v1/required-documents). Anche le condizioni del Suo programma (PUT /v1/programme). |
statements:write | Inviare un estratto conto (POST /v1/statements). |
clients:write | Gestire i Suoi clienti: aggiungere e disattivare segnalatori (POST /v1/prescribers, POST /v1/prescribers/{id}/disable), emettere, sostituire e disattivare link (POST /v1/client-links, POST /v1/client-links/{id}/disable), e leggerli, insieme agli inviti e al rapporto. |
webhooks:write | Gestire gli endpoint dei webhook: crearli, fermarli, ruotare il segreto, inviare un test, e leggere l’elenco e i registri di consegna. |
onboarding:write | Creare link di onboarding per i Suoi fornitori (POST /v1/onboarding-links) e leggerli. |
exports:write | Esportare tutti i Suoi dati (POST /v1/exports, GET /v1/exports, GET /v1/exports/{id} e i suoi documenti). Solo chiavi di produzione. |
I percorsi sono relativi all’URL di base. Ogni chiamata può rispondere 401 (unauthorized o key_expired), una chiamata che richiede un ambito può rispondere 403 forbidden (la chiave non ha l’ambito, o il finanziatore non è attivo), e 500 significa riprovare più tardi. Non vengono ripetuti sotto; la sezione Errori elenca ogni codice.
A quale finanziatore appartiene una chiave, il suo ambiente e i suoi ambiti. Cominci da qui.
/v1/healthSe l’API è attiva. Pubblica: nessuna chiave, nessun dato, nessun accesso al database.
Advanta interroga questa route ogni 5 minuti; i risultati sono sulla pagina di stato pubblica.
curl -s "$BASE/v1/health"/v1/meChi sta chiamando: la chiave, il suo finanziatore, il suo ambiente e i suoi ambiti.
key.prefix sono i primi 12 caratteri della chiave. key.expires_at è null per una chiave che non scade; key.prospect indica a chi è stata emessa una chiave sandbox.
curl -s "$BASE/v1/me" \
-H "Authorization: Bearer $ADVANTA_KEY"{
"api_version": "2026-09-23",
"environment": "sandbox",
"funder": {
"bank_id": "6d164c92-02cc-4f9a-ae8d-3f7f5ef043d3",
"name": "Compartment Demo (LU)"
},
"key": {
"id": "0b3c6a52-5d0e-4b53-9d0e-1c2b3a4d5e6f",
"name": "sandbox · Example prospect",
"prefix": "adv_fk_1a2b3",
"scopes": ["requests:read", "limits:read", "webhooks:write"],
"created_at": "2026-09-23T18:00:00Z",
"expires_at": "2026-10-07T18:00:00Z",
"prospect": "Example prospect"
}
}Legga le richieste che Advanta Le ha assegnato, poi offra, rifiuti, finanzi o registri un incasso; e chieda di più ai debitori di una richiesta quando serve.
/v1/requestsLe richieste a Lei assegnate (può agire su di esse) e quelle su cui ha già agito (in sola lettura, anche dopo una riassegnazione), dalla più recente, ciascuna con la Sua offerta in my_offer, se l’ha fatta.
| Nome | Dove | Descrizione |
|---|---|---|
status | query | open (predefinito: pending, submitted, under_review, terms_sent, accepted, approved), all, oppure un solo stato. |
limit | query | Da 1 a 200, predefinito 50. |
Una richiesta contiene id, request_ref, type (factoring o confirming), status, total_amount, advance_amount, il cedente in company_name e company_nif, invoice_count, assigned_bank_id, consent_level_required (ciò che ogni debitore deve firmare prima che possa essere finanziata, fissato all’assegnazione), le sue date e, per ogni debitore, debtor_consent. La specifica elenca ogni campo.
curl -s "$BASE/v1/requests?status=all&limit=50" \
-H "Authorization: Bearer $ADVANTA_KEY"const BASE = 'https://bzsengbmlzzhztjfvcag.supabase.co/functions/v1/funder-api';
const headers = { Authorization: `Bearer ${process.env.ADVANTA_KEY}` };
const res = await fetch(`${BASE}/v1/requests?status=open&limit=200`, { headers });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { funder, requests } = await res.json();
// Routed to you (you can act on them) and not priced by you yet
const toPrice = requests.filter((r) => r.assigned_bank_id === funder.bank_id && !r.my_offer);
for (const r of toPrice) console.log(r.request_ref, r.type, r.total_amount, r.company_name);{
"funder": {
"bank_id": "6d164c92-02cc-4f9a-ae8d-3f7f5ef043d3",
"name": "Compartment Demo (LU)"
},
"count": 1,
"requests": [
{
"id": "4c1e0d2a-8f3b-4f6e-9a55-3c2b1d0e9f87",
"request_ref": "FR-2026-0042",
"type": "factoring",
"status": "terms_sent",
"total_amount": 18450.00,
"company_name": "Example Seller, S.L.",
"invoice_count": 3,
"assigned_bank_id": "6d164c92-02cc-4f9a-ae8d-3f7f5ef043d3",
"consent_level_required": "acknowledgment",
"created_at": "2026-09-22T09:12:00Z",
"my_offer": {
"funding_request_id": "4c1e0d2a-8f3b-4f6e-9a55-3c2b1d0e9f87",
"rate": 2.4,
"advance_pct": 90,
"days": 60,
"status": "pending",
"submitted_at": "2026-09-23T10:30:00Z",
"accepted_at": null
},
"debtor_consent": [
{
"debtor_name": "Example Buyer, S.A.",
"debtor_tax_id": "A00000000",
"status": "pending",
"level_required": "acknowledgment",
"level_achieved": null,
"meets_requirement": false
}
]
}
]
}/v1/requests/{id}Il fascicolo di valutazione di una richiesta: la richiesta, i suoi crediti, l’Advanta Score più recente del cedente, la Sua offerta e risk, i segnali di frode e le contestazioni della richiesta, come li mostra il Suo portale.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id della richiesta. |
score va da 300 a 850, con un giudizio da A a E e le sue dimensioni. Viene calcolato al momento se il cedente non ne ha ancora uno, ed è null se il calcolo non riesce. Ogni credito ha invoice_no, invoice_amount, invoice_date, invoice_due_date e il debitore in customer_name. debtor_consent indica, per ogni debitore, lo stato della notifica, il livello richiesto e il livello firmato (level_achieved), meets_requirement, il canale, il testo della dichiarazione firmato e chi l’ha firmato.
risk.signals elenca i segnali di frode ancora aperti o confermati, ognuno con un code stabile (per esempio amount_above_history) e una severity. Un segnale hard (per esempio un importo cambiato mentre la fattura è in una richiesta, una nota di credito sulla fattura o una contestazione aperta) blocca l’assegnazione e il finanziamento finché il team operativo di Advanta non lo esamina; gli altri si limitano a segnalare. risk.disputes elenca tutte le contestazioni registrate sulla richiesta.
curl -s "$BASE/v1/requests/4c1e0d2a-8f3b-4f6e-9a55-3c2b1d0e9f87" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/requests/{id}/decisionOffrire condizioni, rifiutare, finanziare o registrare un incasso. La richiesta deve essere assegnata a Lei, altrimenti 409 not_routed_to_you.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id della richiesta. |
Il body ha una di quattro forme, scelta da decision:
decision | Campi | Effetto |
|---|---|---|
offer | rate (percentuale, oltre 0 e fino a 100) e advance_pct (stesso intervallo), entrambi obbligatori; days, notes, valid_days (da 1 a 90). | Invia le Sue condizioni e porta una richiesta pending, submitted o under-review a terms_sent. L’offerta scade dopo valid_days, altrimenti alla fine della validità configurata (7 giorni per impostazione predefinita). Rifiutata con 409 credit_limit quando uno dei Suoi limiti non può sostenerla, con 409 debtor_not_eligible_for_funder quando accetta solo acquirenti della Sua lista e un debitore non vi compare, e con 409 documents_missing_for_funder quando un documento che richiede al cedente manca, non è verificato o è scaduto. |
decline | reason o notes, almeno uno; notes è il messaggio che legge il cedente. internal_note facoltativo: resta al Suo team, mai mostrato al cedente. | Chiude la richiesta. reason è uno tra payer_credit, invoice_ineligible, documentation, concentration, amount_out_of_range, sector_excluded, no_funder_capacity, withdrawn_by_client o other; il testo libero viene conservato come nota con motivo other. |
fund | value_date (AAAA-MM-GG, la data valuta del Suo bonifico al cedente, al massimo 7 giorni in avanti) e reference (il riferimento del bonifico, da 3 a 140 caratteri); amount facoltativo, verificato rispetto all’anticipo accettato. | Solo dopo che il cedente ha accettato le Sue condizioni (stato approved). Nel factoring, la notifica di ogni debitore deve essere prima confermata (altrimenti 409 funding_gate_failed), e i documenti che richiede al cedente devono essere validi alla data del finanziamento (altrimenti 409 documents_missing_for_funder). |
settle | amount (obbligatorio); received_at (predefinito adesso, al massimo un giorno avanti); reference (fino a 140 caratteri); note (fino a 1.000); final. | Registra denaro incassato su una richiesta finanziata. I pagamenti parziali si sommano; la richiesta passa a settled quando il totale raggiunge l’importo della richiesta o final è true. |
curl -s -X POST "$BASE/v1/requests/4c1e0d2a-8f3b-4f6e-9a55-3c2b1d0e9f87/decision" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"decision":"offer","rate":2.4,"advance_pct":90,"days":60,"valid_days":7,"notes":"Subject to the notice being acknowledged"}'async function offer(requestId, terms) {
const res = await fetch(`${BASE}/v1/requests/${requestId}/decision`, {
method: 'POST',
headers: { ...headers, 'Content-Type': 'application/json' },
body: JSON.stringify({ decision: 'offer', ...terms }),
});
const body = await res.json();
if (res.status === 201) return body; // { decision, request_id, offer_id, expires_at, status }
const { code, message, debtors } = body.error;
if (code === 'debtor_not_eligible_for_funder') {
for (const d of debtors) console.warn(d.name ?? d.debtor_key, d.reason, d.invoices);
}
throw new Error(`${res.status} ${code}: ${message}`);
}
await offer('4c1e0d2a-8f3b-4f6e-9a55-3c2b1d0e9f87', { rate: 2.4, advance_pct: 90, days: 60, valid_days: 7 });{
"decision": "offer",
"request_id": "4c1e0d2a-8f3b-4f6e-9a55-3c2b1d0e9f87",
"offer_id": "7a9e3c1b-2d4f-4e6a-8b0c-5d1e2f3a4b5c",
"expires_at": "2026-09-30T10:30:00Z",
"status": "terms_sent"
}{ "decision": "decline", "reason": "concentration", "notes": "We cannot fund this buyer this quarter", "internal_note": "Group exposure above our internal limit" }
{ "decision": "fund", "value_date": "2026-10-01", "reference": "TRF-2026-1001-07" }
{ "decision": "settle", "amount": 12500.00, "received_at": "2026-10-30T10:00:00Z", "reference": "ADV-A1F51301-1000" }/v1/requests/{id}/consent-levelAlzare ciò che i debitori di una richiesta devono firmare. Solo verso l’alto, solo su una richiesta di factoring a Lei assegnata e in corso, e solo prima che uno dei suoi debitori abbia risposto.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id della richiesta. |
level obbligatorio | body | receipt, acknowledgment o acceptance, dal più basso al più alto. |
reason obbligatorio | body | Il motivo, almeno 8 caratteri. |
curl -s -X POST "$BASE/v1/requests/4c1e0d2a-8f3b-4f6e-9a55-3c2b1d0e9f87/consent-level" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"level":"acceptance","reason":"Credit committee asked for acceptance on this buyer"}'Ciò che deve essere in regola prima di finanziare: i documenti che richiede ai cedenti, per paese del cedente, e ciò che ogni debitore deve firmare. Ogni richiesta conserva le versioni che hanno soddisfatto i Suoi requisiti.
/v1/requests/{id}/documentsIl fascicolo documentale di una richiesta. Quando la richiesta Le è stata assegnata, e di nuovo quando è stata finanziata, Advanta ha registrato quale versione di ogni documento da Lei richiesto La soddisfaceva: nome del file, SHA-256, date di emissione e di validità, e quando e come Advanta l’ha verificato. Questa registrazione non cambia mai, anche quando il cedente carica versioni più recenti; ogni voce indica anche la situazione odierna del documento, e current elenca i documenti attuali del cedente.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id della richiesta. |
Ogni voce con un file porta un download_url valido due minuti (url_expires_in), e ogni URL emesso viene registrato. Confronti lo SHA-256 di ciò che scarica con quello registrato.
curl -s "$BASE/v1/requests/4c1e0d2a-8f3b-4f6e-9a55-3c2b1d0e9f87/documents" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/required-documentsI documenti che richiede ai cedenti, per paese del cedente, e il catalogo da cui sono scelti: il codice di ogni documento, il nome in sette lingue, l’ente emittente, la validità abituale e la sensibilità. La validità abituale serve solo come precompilazione: conta la data stampata sul documento, che il cedente registra e Advanta controlla.
Una richiesta Le viene assegnata, la Sua offerta viene registrata e la richiesta viene finanziata solo finché ogni documento della Sua lista per il paese del cedente è verificato da Advanta e valido in quella data; altrimenti 409 documents_missing_for_funder.
curl -s "$BASE/v1/required-documents" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/required-documentsSostituire la Sua lista per un paese dei cedenti; una lista vuota la cancella. I codici provengono dal catalogo, e la modifica resta registrata nella catena di evidenze di Advanta con note. Le richieste già presso di Lei restano Sue; la Sua prossima offerta o il prossimo finanziamento su una di esse attende finché il cedente non soddisfa la nuova lista (open_requests_not_meeting le conta).
| Nome | Dove | Descrizione |
|---|---|---|
country obbligatorio | body | Il paese del cedente, due lettere. |
codes obbligatorio | body | Codici di documento del catalogo. |
note | body | Fino a 500 caratteri. |
curl -s -X PUT "$BASE/v1/required-documents" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"country":"PT","codes":["cert_hacienda","cert_seguridad_social","cirbe"],"note":"Credit committee of 23 September"}'/v1/settingsCiò che i Suoi debitori devono firmare prima del finanziamento: il livello che ogni debitore deve firmare prima che una richiesta di factoring a Lei assegnata possa essere finanziata (receipt, poi acknowledgment, poi acceptance), se contano solo i testi di dichiarazione approvati da un avvocato, le Sue richieste aperte per livello, e per quali livelli ogni legge applicabile ha un testo di dichiarazione, e in quali lingue.
curl -s "$BASE/v1/settings" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/settingsCambiare ciò che i Suoi debitori devono firmare. La modifica si applica alle richieste assegnate a Lei da quel momento; una richiesta già assegnata mantiene il livello con cui è stata assegnata. reason resta registrato nella catena di evidenze di Advanta.
| Nome | Dove | Descrizione |
|---|---|---|
debtor_consent_level | body | receipt, acknowledgment o acceptance. |
require_counsel_approved_texts | body | true per contare solo i testi di dichiarazione approvati da un avvocato. |
reason obbligatorio | body | Il motivo, almeno 8 caratteri. |
curl -s -X PUT "$BASE/v1/settings" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"debtor_consent_level":"acknowledgment","reason":"Credit committee decision of 22 September"}'Scelga, come impostazione predefinita e per azienda, se ogni debitore riceve la notifica prima che Lei finanzi (notificato) o se la notifica viene preparata e tenuta pronta all’invio (confidenziale), pro solvendo o pro soluto, e se richiede i dati bancari del cedente. Poi notifichi una richiesta confidenziale, legga le sue notifiche e il flusso di cassa che il cedente condivide con Lei, e segua le Sue richieste di regresso.
/v1/programmeLe condizioni del Suo programma: le Sue condizioni predefinite, quelle fissate per aziende specifiche, le aziende per cui può fissarle (quelle con una richiesta a Lei assegnata, e i Suoi clienti) e le Sue richieste di factoring contate per le condizioni che portano. Una richiesta prende le condizioni in vigore quando Le viene assegnata e le mantiene.
disclosure: announced (predefinito): ogni debitore riceve la notifica e conferma la cessione prima che Lei finanzi. confidential: quando la richiesta Le viene assegnata, la notifica a ogni debitore viene preparata, con la sua impronta (SHA-256), e conservata pronta all’invio, e il finanziamento non attende il debitore. Prima del finanziamento devono essere superati tutti i controlli bloccanti sulle fatture, le fatture devono provenire dalla contabilità del cedente stesso (ERP, fattura elettronica o SAF-T), ogni debitore deve avere una notifica preparata e aggiornata che nomina Lei e un indirizzo a cui inviarla, e la verifica del cedente deve essere approvata. Le notifiche vengono inviate quando Lei notifica la richiesta e, automaticamente, su una richiesta finanziata, quando si verifica un evento che ha attivato: announce_overdue_days, announce_on_dispute, announce_on_kyc_lapse.
recourse: with (pro solvendo) o without (pro soluto). recourse_days: giorni dopo la scadenza di una fattura prima che una richiesta finanziata non ancora saldata apra una richiesta di regresso (null: nessuna). bank_data: off, requested (si chiede al cedente di collegare per Lei il suo conto aziendale, in sola lettura e con il suo consenso) o required (il finanziamento attende anche che il conto su cui Lei paga sia confermato come del cedente stesso).
curl -s "$BASE/v1/programme" \
-H "Authorization: Bearer $ADVANTA_KEY"{
"funder": { "bank_id": "6d164c92-02cc-4f9a-ae8d-3f7f5ef043d3", "name": "Example Funder" },
"default": {
"disclosure": "announced",
"recourse": "with",
"recourse_days": 30,
"announce_overdue_days": null,
"announce_on_dispute": false,
"announce_on_kyc_lapse": false,
"bank_data": "requested",
"source": "funder_default",
"updated_at": "2026-09-28T10:00:00Z"
},
"companies": [
{
"seller_id": "2f6d8a4e-1b3c-4d5e-9f70-8a1b2c3d4e5f",
"company_name": "Example Seller, S.L.",
"tax_id": "B00000000",
"terms": { "disclosure": "confidential", "recourse": "with", "recourse_days": 30, "announce_overdue_days": 15, "announce_on_dispute": true, "announce_on_kyc_lapse": true, "bank_data": "required", "source": "seller" },
"reason": "Credit committee of 28 September"
}
],
"requests": { "announced:with:open": 4, "confidential:with:funded": 1 }
}/v1/programmeCambiare le Sue condizioni predefinite (senza seller_id) o quelle di un’azienda. Cambiano solo le chiavi inviate; {"reset": true} con un seller_id riporta quell’azienda alle Sue condizioni predefinite. La modifica si applica alle richieste assegnate a Lei da quel momento; quelle già assegnate mantengono le loro condizioni. reason resta registrato nella catena di evidenze di Advanta.
| Nome | Dove | Descrizione |
|---|---|---|
seller_id | body | L’id di un’azienda, da sellers in GET /v1/programme. Assente o null: le Sue condizioni predefinite. |
terms obbligatorio | body | Le condizioni da cambiare: disclosure, recourse, recourse_days, announce_overdue_days, announce_on_dispute, announce_on_kyc_lapse, bank_data; oppure reset. |
reason obbligatorio | body | Il motivo, almeno 8 caratteri. |
curl -s -X PUT "$BASE/v1/programme" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"seller_id":"2f6d8a4e-1b3c-4d5e-9f70-8a1b2c3d4e5f","terms":{"disclosure":"confidential","announce_overdue_days":15,"announce_on_dispute":true,"announce_on_kyc_lapse":true,"bank_data":"required"},"reason":"Credit committee of 28 September"}'/v1/requests/{id}/announceNotificare una richiesta confidenziale a Lei assegnata: diventa notificata e le notifiche preparate per essa vengono inviate ai suoi debitori, che poi le confermano come in un programma notificato. Possibile finché la richiesta è in attesa, in esame, con condizioni inviate, approvata o finanziata. Segue un evento request.announced; una volta inviata una notifica, la richiesta resta notificata.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id della richiesta. |
reason obbligatorio | body | Il motivo, almeno 8 caratteri. Resta registrato nella catena di evidenze di Advanta. |
curl -s -X POST "$BASE/v1/requests/4c1e0d2a-8f3b-4f6e-9a55-3c2b1d0e9f87/announce" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"reason":"Invoice 2026-118 is 20 days overdue"}'/v1/requests/{id}/noticesLe notifiche di cessione della richiesta, una per debitore, ciascuna con il suo documento preparato quando c’è: l’oggetto e l’HTML esatti che il debitore riceve, la lingua, la legge applicabile e lo SHA-256. Per una richiesta a Lei assegnata, o una su cui ha già agito.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id della richiesta. |
L’HTML contiene un segnaposto, ACK_LINK tra doppie parentesi graffe, dove va il link di conferma del debitore; il link contiene un segreto e non viene mai mostrato. current dice se il documento corrisponde ancora alle fatture e all’importo della notifica.
curl -s "$BASE/v1/requests/4c1e0d2a-8f3b-4f6e-9a55-3c2b1d0e9f87/notices" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/requests/{id}/cash-flowCiò che il cedente condivide con Lei del suo conto aziendale, in sola lettura e con il suo consenso, tramite un prestatore autorizzato di servizi di informazione sui conti: il collegamento, i conti (gli ultimi quattro caratteri di ogni IBAN) e i saldi, dodici mesi di movimenti per mese e la verifica del suo conto di accredito. cash_flow è null finché il cedente non ha collegato un conto per Lei.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id della richiesta. |
bank_data_problems dice cosa attende ancora il finanziamento quando le Sue condizioni richiedono i dati bancari. payment_alerts sono i pagamenti che il cedente ha ricevuto da un debitore di questa richiesta dopo che Lei l’ha finanziata a condizioni confidenziali. Il consenso di un cedente è dato a un finanziatore: Lei vede solo ciò che condivide con Lei.
curl -s "$BASE/v1/requests/4c1e0d2a-8f3b-4f6e-9a55-3c2b1d0e9f87/cash-flow" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/recourseLe Sue richieste di factoring finanziate per tipo di regresso (with, without, e not_recorded per quelle assegnate prima del 28 settembre 2026), le richieste di regresso contate per tipo e stato, e le richieste stesse, prima quelle aperte. Se ne apre una per richiesta quando una richiesta finanziata non è saldata recourse_days dopo la scadenza di una fattura: recourse, verso il cedente, per l’importo anticipato più le Sue commissioni, meno quanto già incassato; debtor_default, pro soluto, per il Suo recupero crediti e la Sua assicurazione.
| Nome | Dove | Descrizione |
|---|---|---|
status | query | open, settled, withdrawn o written_off. Assente: tutte. |
Il cedente rimborsa una richiesta di regresso su pay_to_iban indicando pay_reference. Quando i pagamenti che Lei registra da quel momento (una riga di estratto conto che conferma, o la decisione settle) coprono claim_amount, la richiesta di regresso è saldata e la richiesta si chiude come saldata per regresso: le fatture tornano al cedente, ancora non pagate dal debitore.
curl -s "$BASE/v1/recourse?status=open" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/recourse/{id}/closeChiudere una Sua richiesta di regresso aperta: una richiesta di regresso diventa withdrawn (vi ha rinunciato, o ha concordato altro con il cedente), un inadempimento del debitore diventa written_off (passato al Suo recupero crediti o al Suo assicuratore). reason resta registrato nella catena di evidenze di Advanta.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id della richiesta di regresso (claim_id). |
status obbligatorio | body | withdrawn o written_off. |
reason obbligatorio | body | Il motivo, almeno 8 caratteri. |
curl -s -X POST "$BASE/v1/recourse/$CLAIM_ID/close" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"status":"withdrawn","reason":"Payment plan agreed with the seller on 2 October"}'/v1/bank-dataIl Suo conto di incasso, collegato dal Suo amministratore nel portale e letto allo stesso modo: i movimenti passano per la stessa riconciliazione di POST /v1/statements, così gli incassi si abbinano alle Sue richieste finanziate senza inviare file. Inoltre: quanti cedenti condividono il loro conto con Lei, gli avvisi di pagamento sulle Sue richieste (gli ultimi 180 giorni) e i costi del prestatore registrati a Suo carico, per mese.
unit_price_eur e amount_eur sono null finché il prezzo del prestatore non è fissato.
curl -s "$BASE/v1/bank-data" \
-H "Authorization: Bearer $ADVANTA_KEY"La Sua esposizione per debitore e per cedente, applicata dalla piattaforma stessa, con limiti fissati uno alla volta o fino a 2.000 in una volta; come un acquirente paga i suoi fornitori; e ciò che Advanta sa di ogni debitore di una richiesta.
/v1/credit-limitsIl Suo registro per debitore: il Suo limite e ciò che è in essere, impegnato, offerto e ancora disponibile, in euro.
Ogni debitore contiene debtor_key, debtor_name, debtor_country, limit_status, limit_amount, outstanding, committed, offered, available, overdue_count, oldest_overdue, frozen, decided_at e note.
curl -s "$BASE/v1/credit-limits" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/credit-limitsFissare o rivedere il Suo limite su un debitore, o rifiutare il debitore. Il database rifiuta ogni offerta successiva che questo limite non può sostenere.
| Nome | Dove | Descrizione |
|---|---|---|
debtor_tax_id obbligatorio | body | La partita IVA o il codice fiscale del debitore. |
debtor_country | body | ISO 3166 alpha-2. |
debtor_name | body | Il nome del debitore. |
amount | body | Euro, 0 o più. Obbligatorio per un limite attivo. |
status | body | active (predefinito), refused o suspended. |
note | body | Testo libero. |
curl -s -X PUT "$BASE/v1/credit-limits" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"debtor_tax_id":"A00000000","debtor_country":"ES","debtor_name":"Example Buyer, S.A.","amount":250000,"status":"active"}'/v1/credit-limits/importCaricare fino a 2.000 limiti su debitori in una sola chiamata: il Suo registro, o i limiti della Sua assicurazione crediti. Ogni riga è verificata esattamente come PUT /v1/credit-limits ne verifica uno e riceve una risposta propria: una riga che non passa non ferma le altre, e un debitore che compare due volte nella stessa chiamata viene rifiutato la seconda volta.
| Nome | Dove | Descrizione |
|---|---|---|
rows obbligatorio | body | Da 1 a 2.000 righe, ciascuna con debtor_tax_id e, come in PUT /v1/credit-limits, debtor_country, debtor_name, amount, status e note. amount è un numero o cifre con il punto decimale; è obbligatorio per un limite attivo. È accettata anche la sola lista di righe, senza l’oggetto intorno (con source import). |
source | body | import (i Suoi limiti, predefinito) o insurer (i limiti della Sua assicurazione crediti). |
source_ref | body | Il file o il lotto da cui vengono i limiti, al massimo 200 caratteri. |
Ogni limite scritto registra la sua fonte e il suo riferimento, sul limite e nel suo storico. La risposta conta received, written e refused, e risponde a ogni riga con row (contando da 1), debtor_tax_id e ok: una riga scritta aggiunge debtor_key, status e amount; una riga rifiutata dà il suo error (invalid_amount, debtor_tax_id_required, duplicate_debtor, invalid_status, amount_required, invalid_country, row_invalid o invalid_limit) e può aggiungere un detail.
curl -s -X POST "$BASE/v1/credit-limits/import" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"source":"insurer","source_ref":"Insurer limits 2026-09","rows":[{"debtor_tax_id":"A00000000","debtor_country":"ES","debtor_name":"Example Buyer, S.A.","amount":250000},{"debtor_tax_id":"500000000","debtor_country":"PT","status":"refused"}]}'/v1/seller-limitsIl Suo registro per cedente, con le stesse cifre del registro dei debitori.
Ogni cedente contiene seller_id, seller_name, seller_nif, seller_country e gli stessi campi di limite ed esposizione di un debitore.
curl -s "$BASE/v1/seller-limits" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/seller-limitsFissare o rivedere il Suo limite su un cedente, o rifiutare il cedente.
| Nome | Dove | Descrizione |
|---|---|---|
seller_id obbligatorio | body | Come restituito da GET /v1/seller-limits. |
amount | body | Euro, 0 o più. |
status | body | active (predefinito), refused o suspended. |
note | body | Testo libero. |
curl -s -X PUT "$BASE/v1/seller-limits" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"seller_id":"2f6d8a4e-1b3c-4d5e-9f70-8a1b2c3d4e5f","amount":100000,"status":"active","note":"Annual review"}'/v1/payer-recordCome un acquirente paga i propri fornitori, solo in forma aggregata, dalla contabilità dei fornitori collegati ad Advanta. Il profilo è pubblicato quando almeno tre fornitori osservano l’acquirente; altrimenti status dice perché e ogni cifra è null. Può leggerlo solo per un acquirente presente in una richiesta del Suo ambito o nella Sua lista di debitori; una chiave sandbox legge il profilo del piano dimostrativo.
| Nome | Dove | Descrizione |
|---|---|---|
tax_id obbligatorio | query | La partita IVA o il codice fiscale dell’acquirente. |
country | query | ISO 3166 alpha-2. |
Le cifre comprendono observers, invoice_count, avg_days_to_pay, median_days_to_pay, on_time_pct, il ritardo di pagamento (avg_settle_delay_days, median_settle_delay_days, p75_settle_delay_days, worst_settle_delay_days), i conteggi di fatture aperte e scadute, window_from e refreshed_at. payer_record è null quando non c’è un profilo.
curl -s "$BASE/v1/payer-record?tax_id=A00000000&country=ES" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/requests/{id}/debtorsCiò che Advanta sa di ogni debitore di una richiesta di factoring a Lei assegnata, o di una su cui ha già agito: il suo level su Advanta da level_since (notice: conosce Advanta solo dalla notifica; account: ha attivato il suo conto pagatore; books: ha collegato il suo sistema contabile; buyer: gestisce un programma acquirente, e buyer_programme è true), lo storico del cedente stesso con lui, il suo tempo medio di pagamento ufficiale quando è un ente pubblico, e il Suo limite su di lui.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id della richiesta. |
score è il punteggio del debitore stesso (classe, da 0 a 100, quando e con quale versione del modello). È dato solo quando il debitore condivide i suoi dati con i finanziatori che finanziano fatture dovute da lui, è al livello books o buyer, e la richiesta è a Lei assegnata (non una su cui ha solo agito); altrimenti è null. pair_history è lo storico del cedente con questo debitore su 36 mesi, con le regole del profilo di pagamento: solo fatture reali, e ritardo solo rispetto alle scadenze indicate sul documento o nell’ERP. public_payment_period è il più recente tempo medio di pagamento ufficiale di un ente pubblico (DGAL per i comuni portoghesi, Hacienda per gli enti locali spagnoli). credit_limit è il Suo limite sul debitore, da dove viene (source, source_ref) e quanto è utilizzato (exposure: in essere più impegnato più offerto, in euro).
curl -s "$BASE/v1/requests/4c1e0d2a-8f3b-4f6e-9a55-3c2b1d0e9f87/debtors" \
-H "Authorization: Bearer $ADVANTA_KEY"Invii l’estratto del Suo conto di incasso e ogni accredito viene riconciliato con le Sue richieste finanziate; Lei conferma ogni abbinamento nel portale. Per registrare direttamente un pagamento, invii la decisione settle.
/v1/statementsInviare l’estratto del Suo conto di incasso per la riconciliazione: un file CAMT.053 (XML) o CSV, al massimo 4 MiB e 5.000 movimenti. Ogni accredito viene riconciliato con le Sue richieste finanziate, prima di tutto sul riferimento indicato dal debitore. Nulla viene registrato come incassato finché Lei non conferma un abbinamento nel portale. Lo stesso file inviato due volte viene rifiutato, in base al suo SHA-256.
| Nome | Dove | Descrizione |
|---|---|---|
file_name | query | Il nome del file (facoltativo). |
kind | query | camt053 o csv; rilevato se omesso. |
| il file obbligatorio | body | Il file originale, inviato come application/xml o text/csv; oppure JSON { file_name, kind, content_base64 }. |
curl -s -X POST "$BASE/v1/statements?file_name=statement-2026-10-30.xml&kind=camt053" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/xml" \
--data-binary @statement-2026-10-30.xmlPorti i Suoi clienti: un Suo link aperto, un link per segnalatore, e gli inviti e il rapporto che mostrano chi è arrivato da ciascuno. Le aziende che porta vengono assegnate solo a Lei.
/v1/client-linksIl Suo link aperto (prescriber_id null) e il link attuale di ogni segnalatore, con il suo state (active, disabled o expired) e il suo url finché funziona.
| Nome | Dove | Descrizione |
|---|---|---|
lang | query | La lingua della pagina che apre ogni link: pt, es, en, fr, de, it o nl, aggiunta al suo url. |
Un’azienda che apre un link indica nome, numero fiscale, paese ed email, e riceve il Suo invito via email. Quando lo accetta, diventa Sua cliente: le sue richieste vengono assegnate solo a Lei, e la sua origine (il link, il segnalatore, la data) viene registrata. Aprire un link non crea mai da solo un account.
Ogni link riporta anche arrivals (le aziende arrivate da Lei per la prima volta tramite quel link) e claims_last_day (le iscrizioni tramite il link nelle ultime 24 ore; un link ne accetta al massimo 20 all’ora e 100 al giorno).
curl -s "$BASE/v1/client-links?lang=es" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/client-linksEmettere il Suo link aperto, o quello di un segnalatore con prescriber_id. C’è un solo link funzionante per titolare: finché ne funziona uno, invii replace: true per sostituirlo (il precedente smette subito di funzionare); altrimenti 409 link_exists. Si conserva solo lo SHA-256 del token del link, e l’emissione viene registrata nella catena di evidenze di Advanta.
| Nome | Dove | Descrizione |
|---|---|---|
prescriber_id | body | Uno dei Suoi segnalatori attivi; lo ometta, o invii null, per il Suo link. |
expires_at | body | Facoltativo: tra un’ora e tre anni da adesso. |
replace | body | true per sostituire un link che funziona ancora. Predefinito false. |
reason | body | Il motivo, fino a 200 caratteri. Resta sul link sostituito e nella catena di evidenze. |
lang | body | La lingua della pagina che apre il link, aggiunta al suo url. |
Un link emesso con una chiave sandbox crea solo inviti di test, e la chiave ha bisogno di decisions:write: i link del finanziatore dimostrativo sono condivisi da tutte le dimostrazioni.
curl -s -X POST "$BASE/v1/client-links" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"replace":true,"reason":"The old link was forwarded too widely","lang":"es"}'{
"client_link": {
"id": "8d3e1f2a-4b5c-4d6e-9f70-1a2b3c4d5e6f",
"prescriber_id": null,
"state": "active",
"created_at": "2026-09-26T10:00:00Z",
"expires_at": null,
"disabled_at": null,
"disabled_reason": null,
"replaced_by": null,
"arrivals": 0,
"claims_last_day": 0,
"url": "https://app.advanta.capital/join?link=…&lang=es"
}
}/v1/client-links/{id}/disableDisattivare un link. Smette subito di funzionare; le aziende già arrivate tramite il link mantengono la loro origine. Disattivare un link già disattivato non cambia nulla (changed è false). Per darne uno nuovo, chiami POST /v1/client-links.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id del link, da GET /v1/client-links. |
reason | body | Il motivo, fino a 200 caratteri. |
curl -s -X POST "$BASE/v1/client-links/$LINK_ID/disable" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"reason":"Campaign ended"}'/v1/prescribersI Suoi segnalatori, le persone e gli studi che Le portano clienti (commercialisti, consulenti, mediatori), prima quelli attivi, ognuno con il suo link attuale e il numero di aziende arrivate tramite esso. Sono Suoi, non partner di Advanta. Lo stesso elenco della pagina Clienti del Suo portale.
| Nome | Dove | Descrizione |
|---|---|---|
lang | query | La lingua della pagina che apre ogni link: pt, es, en, fr, de, it o nl, aggiunta al suo url. |
Una chiave sandbox legge i segnalatori del finanziatore dimostrativo, condivisi da tutte le dimostrazioni.
curl -s "$BASE/v1/prescribers?lang=es" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/prescribersAggiungere un segnalatore. Il suo link aperto viene emesso insieme a lui, in prescriber.link.url. Il suo nome e la sua email restano fuori dalla catena di evidenze di Advanta: vi entrano solo i loro hash.
| Nome | Dove | Descrizione |
|---|---|---|
name obbligatorio | body | Da 2 a 120 caratteri, unico tra i Suoi segnalatori attivi. |
email | body | Facoltativa. Un finanziatore sandbox registra solo indirizzi riservati (che finiscono in .example, .invalid, .test o .demo). |
notes | body | Facoltative, fino a 1.000 caratteri. |
lang | body | La lingua della pagina che apre il suo link, aggiunta al suo url. |
Con una chiave sandbox questo cambia lo stato dimostrativo condiviso, quindi la chiave ha bisogno di decisions:write.
curl -s -X POST "$BASE/v1/prescribers" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Gestoría Norte","email":"ana@gestoria-norte.example","notes":"Accountant in Bilbao","lang":"es"}'{
"prescriber": {
"id": "5f1c2a8e-3b7d-4e0a-9c61-2d4b8e7f9a10",
"name": "Gestoría Norte",
"email": "ana@gestoria-norte.example",
"notes": "Accountant in Bilbao",
"active": true,
"created_at": "2026-09-10T09:00:00Z",
"disabled_at": null,
"link": {
"id": "1e2f3a4b-5c6d-4e7f-8a9b-0c1d2e3f4a5b",
"prescriber_id": "5f1c2a8e-3b7d-4e0a-9c61-2d4b8e7f9a10",
"state": "active",
"expires_at": null,
"arrivals": 0,
"url": "https://app.advanta.capital/join?link=…&lang=es"
}
}
}/v1/prescribers/{id}/disableDisattivare un segnalatore. Il suo link smette subito di funzionare; le aziende che ha portato restano attribuite a lui. Disattivare un segnalatore già disattivato non cambia nulla (changed è false). Registrato nella catena di evidenze di Advanta.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id del segnalatore. |
reason | body | Il motivo, fino a 200 caratteri. |
curl -s -X POST "$BASE/v1/prescribers/$PRESCRIBER_ID/disable" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"reason":"Agreement ended"}'/v1/prescribers/reportChe cosa Le ha portato ogni segnalatore: un gruppo per segnalatore, poi il Suo link (own_link), i Suoi inviti per nome (named) e i Suoi link di onboarding (api). Per gruppo e per azienda: quando è arrivata, quando è stato aperto il suo account (joined), quando è stata approvata la verifica dell’azienda (onboarded), le richieste assegnate a Lei, l’importo richiesto e l’importo finanziato. Gli stessi numeri del Suo portale.
Un’azienda conta una volta, per chi l’ha portata da Lei per primo. L’importo finanziato è l’anticipo (altrimenti il totale) delle richieste finanziate o incassate, in euro; totals somma tutti i gruppi. Solo i Suoi dati e solo aziende del Suo piano di dati: una chiave sandbox non vede ciò che altre chiavi sandbox hanno fatto tramite l’API.
curl -s "$BASE/v1/prescribers/report" \
-H "Authorization: Bearer $ADVANTA_KEY"{
"funder": {
"bank_id": "6d164c92-02cc-4f9a-ae8d-3f7f5ef043d3",
"name": "Compartment Demo (LU)"
},
"plane": "sandbox",
"generated_at": "2026-09-26T10:00:00Z",
"currency": "EUR",
"totals": { "arrived": 1, "joined": 1, "onboarded": 1, "requests": 1, "amount_requested": 18450.00, "amount_funded": 16605.00 },
"groups": [
{
"kind": "prescriber",
"prescriber_id": "5f1c2a8e-3b7d-4e0a-9c61-2d4b8e7f9a10",
"name": "Gestoría Norte",
"active": true,
"since": "2026-09-10T09:00:00Z",
"arrived": 1,
"joined": 1,
"onboarded": 1,
"requests": 1,
"amount_requested": 18450.00,
"amount_funded": 16605.00,
"companies": [
{
"company_name": "Example Seller, S.L.",
"company_tax_id": "B00000000",
"country": "ES",
"arrived_at": "2026-09-15T11:02:00Z",
"joined_at": "2026-09-15T11:20:00Z",
"onboarded_at": "2026-09-16T09:15:00Z",
"requests": 1,
"amount_requested": 18450.00,
"amount_funded": 16605.00
}
]
}
]
}/v1/client-invitationsTutti i Suoi inviti, dal più recente: tramite un link, per nome nel portale o con un link di onboarding. Ognuno indica come è arrivata l’azienda (via: link, named o api), il segnalatore che l’ha portata, se c’è, il suo state (pending, accepted, revoked o expired), l’azienda, il contatto e le date.
| Nome | Dove | Descrizione |
|---|---|---|
limit | query | Da 1 a 500, predefinito 200. |
Solo il Suo piano di dati. Una chiave sandbox non vede gli inviti fatti da altre chiavi sandbox.
curl -s "$BASE/v1/client-invitations?limit=50" \
-H "Authorization: Bearer $ADVANTA_KEY"Ogni mattina, le fatture dei Suoi clienti che durante la notte sono diventate ammissibili secondo le Sue regole, e ciò che è cambiato in quelle che Le sono state mostrate. Il webhook opportunities.daily dice quando c’è qualcosa da leggere.
/v1/opportunitiesIl riepilogo di un giorno, dai Suoi clienti (le aziende di cui Lei è il finanziatore di riferimento) che Le permettono di vedere le loro fatture. Ogni mattina verso le 06:30 ora di Madrid, dopo la prequalifica notturna, Advanta elenca le fatture diventate ammissibili secondo le Sue regole dal riepilogo precedente (kind new) e ciò che è cambiato in quelle che Le sono già state mostrate: paid, disputed (il cliente ha registrato che il suo debitore la contesta) o no_longer_eligible.
| Nome | Dove | Descrizione |
|---|---|---|
date | query | Il giorno del riepilogo, YYYY-MM-DD (ora di Madrid). Assente: il più recente. Un giorno senza riepilogo risponde date null e nessuna riga. |
Una riga porta la fattura, il debitore con il suo codice fiscale, l’importo ancora dovuto, la scadenza, e il cliente con il suo settore (sezione NACE), la classe e la dimensione; prima le righe nuove, poi i cambiamenti. no_longer_eligible ha un reason: requested (il cliente ha chiesto di finanziarla), cancelled, removed (non è più nei libri del cliente), left_programme, not_shared (il cliente ha smesso di condividere) o rules (non rispetta più le Sue regole).
digest riporta i totali: quanti clienti condividono e quanti non ancora, cosa è ammissibile oggi, cosa è nuovo e cosa è cambiato. stale è true quando l’elaborazione notturna non è terminata: quella mattina non è stato confrontato nulla. Un riepilogo è un elenco calcolato dal database, non un’offerta: una richiesta viene verificata di nuovo quando viene fatta, e Lei decide come sempre. Il webhook opportunities.daily dice quando è pronto un riepilogo con qualcosa dentro.
curl -s "$BASE/v1/opportunities?date=2026-10-07" \
-H "Authorization: Bearer $ADVANTA_KEY"{
"funder": { "bank_id": "6d164c92-02cc-4f9a-ae8d-3f7f5ef043d3", "name": "Example Funder" },
"date": "2026-10-07",
"digest": {
"digest_id": "9b2d4c1e-0f3a-4e5b-8c6d-7a8b9c0d1e2f",
"date": "2026-10-07",
"stale": false,
"snapshot_at": "2026-10-07T03:30:12Z",
"clients": { "sharing": 9, "not_sharing": 1 },
"eligible": { "count": 42, "total": 318450.00 },
"new": { "count": 6, "total": 41200.00 },
"changes": { "paid": 2, "disputed": 0, "no_longer_eligible": 1 },
"currency": "EUR",
"lines": "/v1/opportunities?date=2026-10-07"
},
"lines": [
{
"kind": "new",
"reason": null,
"invoice_id": "0c5e7f3a-2b4d-4c6e-9f81-3a5b7c9d1e2f",
"number": "FV 2026/1184",
"debtor": { "name": "Example Buyer, S.A.", "tax_id": "A00000000", "country": "ES" },
"amount": 12400.00,
"currency": "EUR",
"due_date": "2026-12-15",
"client": { "seller_id": "2f6d8a4e-1b3c-4d5e-9f70-8a1b2c3d4e5f", "name": "Example Seller, S.L.", "tax_id": "B00000000", "sector": "C", "grade": "B", "size_band": "small" }
}
]
}Registri gli endpoint che ricevono i webhook, ruoti i loro segreti, invii un test e legga il registro di consegna.
/v1/webhooksI Suoi endpoint attivi, senza i segreti, e i tipi di evento a cui può abbonarsi. Una chiave sandbox vede solo gli endpoint che ha creato.
curl -s "$BASE/v1/webhooks" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/webhooksRegistrare un endpoint. La risposta contiene il suo segreto di firma, che non viene più mostrato.
| Nome | Dove | Descrizione |
|---|---|---|
url obbligatorio | body | https su un nome host pubblico, porta 443, senza nome utente né password; al massimo 2.048 caratteri. Gli indirizzi privati, di loopback e link-local sono rifiutati, e i reindirizzamenti non vengono mai seguiti. |
events | body | Un elenco di tipi di evento, oppure ["*"] per tutti (predefinito). |
description | body | Fino a 200 caratteri. |
Al massimo 10 endpoint attivi.
curl -s -X POST "$BASE/v1/webhooks" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://hooks.example.com/advanta","events":["request.routed","notice.acknowledged","notice.disputed","request.funded","settlement.recorded"],"description":"Credit desk"}'const res = await fetch(`${BASE}/v1/webhooks`, {
method: 'POST',
headers: { ...headers, 'Content-Type': 'application/json' },
body: JSON.stringify({
url: 'https://hooks.example.com/advanta',
events: ['request.routed', 'notice.acknowledged', 'notice.disputed', 'request.funded', 'settlement.recorded'],
description: 'Credit desk',
}),
});
const body = await res.json();
if (res.status !== 201) throw new Error(`${res.status} ${body.error.code}: ${body.error.message}`);
// The secret is shown once: store it now, in your own secret store.
await secretStore.put(`advanta-webhook-${body.webhook.id}`, body.secret);{
"webhook": {
"id": "e3b1c2d4-5f6a-4b7c-8d9e-0f1a2b3c4d5e",
"url": "https://hooks.example.com/advanta",
"description": "Credit desk",
"events": ["notice.acknowledged", "notice.disputed", "request.funded", "request.routed", "settlement.recorded"],
"active": true,
"secret_prefix": "whsec_1a2b3c",
"created_via": "api"
},
"secret": "whsec_…",
"signature": { "header": "Advanta-Signature", "scheme": "HMAC-SHA256 of \"<t>.<raw body>\"", "tolerance_seconds": 300 }
}/v1/webhooks/{id}Fermare un endpoint. Le consegne ancora in attesa vengono annullate e i suoi segreti eliminati.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id dell’endpoint. |
curl -s -X DELETE "$BASE/v1/webhooks/$WEBHOOK_ID" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/webhooks/{id}/rotate-secretUn nuovo segreto di firma, mostrato una sola volta. Il segreto precedente continua a firmare, come secondo v1 nell’header, per keep_previous_hours, così può passare al nuovo senza perdere eventi.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id dell’endpoint. |
keep_previous_hours | body | Da 0 a 72, predefinito 24. |
curl -s -X POST "$BASE/v1/webhooks/$WEBHOOK_ID/rotate-secret" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"keep_previous_hours":24}'/v1/webhooks/{id}/testMettere in coda un evento webhook.test verso questo endpoint. La prossima esecuzione del dispatcher lo consegna, entro circa un minuto.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id dell’endpoint. |
curl -s -X POST "$BASE/v1/webhooks/$WEBHOOK_ID/test" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/webhooks/{id}/deliveriesIl registro di consegna di un endpoint, dalla più recente: stato (pending, delivered, failed o cancelled), tentativi, codice di risposta, ultimo errore, prossimo tentativo e lo SHA-256 del body esatto inviato.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id dell’endpoint. |
limit | query | Da 1 a 200, predefinito 50. |
curl -s "$BASE/v1/webhooks/$WEBHOOK_ID/deliveries?limit=20" \
-H "Authorization: Bearer $ADVANTA_KEY"Dal Suo prodotto, consegni a un fornitore un link di onboarding di Advanta a uso singolo; il fornitore torna da Lei con uno stato firmato quando ha finito.
/v1/onboarding-linksUn link di onboarding a uso singolo per uno dei Suoi fornitori, attribuito a Lei. Advanta non invia email: è Lei a dare l’url al Suo fornitore. Quando il fornitore ha inviato la verifica della sua azienda, Lei riceve onboarding.completed, e il fornitore viene rimandato al Suo return_url con uno stato firmato.
| Nome | Dove | Descrizione |
|---|---|---|
company_vat obbligatorio | body | La partita IVA o il numero fiscale del fornitore, con o senza il prefisso del paese. |
country obbligatorio | body | ISO 3166 alpha-2. |
contact_email obbligatorio | body | L’email del referente del fornitore. |
return_url obbligatorio | body | https, fino a 2.048 caratteri, su un’origine del Suo elenco di origini di ritorno. Quell’elenco si gestisce nelle impostazioni del portale o lo gestisce Advanta, mai tramite questa API. |
company_name | body | Da 2 a 200 caratteri. Si può omettere per una partita IVA UE che VIES sa nominare. |
contact_name | body | Fino a 120 caratteri. |
metadata | body | Le Sue chiavi e i Suoi valori: al massimo 20 chiavi, valori testo, numero, true, false o null, 2 KB di JSON. Restituiti sul link e in onboarding.completed. |
locale | body | La lingua dell’onboarding: pt, es, en, fr, de, it o nl. |
valid_days | body | Da 1 a 30, predefinito 14. |
La risposta contiene return_secret (ors_ seguito da 64 caratteri esadecimali), mostrato una sola volta: lo conservi subito. Si conserva solo lo SHA-256 del token del link. Un link creato con una chiave sandbox registra il fornitore come azienda di test sul piano dimostrativo.
Quando il fornitore torna, il return_url porta advanta_onboarding (l’id del link), advanta_status (completed), advanta_ts (secondi Unix) e advanta_sig: l’HMAC-SHA256 esadecimale di <advanta_onboarding>.<advanta_status>.<advanta_ts>, con il Suo return_secret come chiave. Lo verifichi prima che la Sua pagina si fidi dello stato, e rifiuti un ritorno a più di 600 secondi dal Suo orologio; l’ultimo esempio qui sotto fa entrambe le cose.
curl -s -X POST "$BASE/v1/onboarding-links" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"company_vat":"PT500000000","country":"PT","contact_email":"ana@fornecedor.example","contact_name":"Ana Sousa","company_name":"Fornecedor Exemplo, Lda.","return_url":"https://portal.example.com/onboarding/done","metadata":{"supplier_ref":"S-42"},"locale":"pt"}'{
"onboarding_link": {
"id": "c2d4e6f8-1a3b-4c5d-8e7f-9a0b1c2d3e4f",
"status": "pending",
"company_name": "Fornecedor Exemplo, Lda.",
"country": "PT",
"return_url": "https://portal.example.com/onboarding/done",
"metadata": { "supplier_ref": "S-42" },
"expires_at": "2026-10-10T10:00:00Z",
"completed_at": null,
"seller_id": null
},
"url": "https://app.advanta.capital/accept-invite?invitation=…&lang=pt",
"expires_at": "2026-10-10T10:00:00Z",
"environment": "sandbox",
"return_secret": "ors_…",
"return": {
"parameters": ["advanta_onboarding", "advanta_status", "advanta_ts", "advanta_sig"],
"signature": "hex HMAC-SHA256(return_secret, \"<advanta_onboarding>.<advanta_status>.<advanta_ts>\")"
}
}import crypto from 'node:crypto';
// On the page behind your return_url.
// url: the full address the supplier came back to
// returnSecret: the "ors_…" string POST /v1/onboarding-links returned, stored when you made the link
export function verifyAdvantaReturn(url, returnSecret, nowSeconds = Math.floor(Date.now() / 1000)) {
const q = new URL(url).searchParams;
const id = q.get('advanta_onboarding') ?? '';
const status = q.get('advanta_status') ?? '';
const ts = q.get('advanta_ts') ?? '';
const sig = q.get('advanta_sig') ?? '';
if (!id || !status || !/^[0-9]{1,12}$/.test(ts) || !/^[0-9a-f]{64}$/.test(sig)) return null;
if (Math.abs(nowSeconds - Number(ts)) > 600) return null; // too old: ask your back end instead
const expected = crypto.createHmac('sha256', returnSecret).update(`${id}.${status}.${ts}`).digest();
if (!crypto.timingSafeEqual(Buffer.from(sig, 'hex'), expected)) return null;
return { onboardingLinkId: id, status }; // status is "completed"
}/v1/onboarding-linksI Suoi link di onboarding, dal più recente, ognuno con il suo status: pending, account_created, completed, expired o revoked. Una chiave sandbox vede i link che ha creato.
| Nome | Dove | Descrizione |
|---|---|---|
limit | query | Da 1 a 200, predefinito 50. |
curl -s "$BASE/v1/onboarding-links?limit=20" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/onboarding-links/{id}Un link di onboarding e a che punto è il fornitore. Una volta completato, seller_id è l’id che usa GET /v1/seller-limits.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id del link. |
curl -s "$BASE/v1/onboarding-links/$ONBOARDING_ID" \
-H "Authorization: Bearer $ADVANTA_KEY"Porti con sé tutto ciò che può vedere su Advanta, quando vuole, senza chiedere: il Suo diritto di uscita (DORA art. 28, par. 8, e art. 30, par. 3, lettera f). Uno ZIP con un CSV e un file JSON Lines per entità, schema.json, manifest.json con lo SHA-256 di ogni file, un README nella Sua lingua e verify.py.
/v1/exportsAvvia un’esportazione di tutto ciò che il Suo finanziatore può vedere: richieste e la loro cronologia, offerte, fatture con la loro verifica, venditori (dati dell’azienda, il riepilogo KYC che può vedere, la verifica del rappresentante), debitori, notifiche con le risposte dei debitori e i dati dei certificati, le voci della catena di prova sulle Sue operazioni con gli hash e le radici giornaliere per verificarle, incassi ed estratti conto, rifiuti dei controlli, le Sue regole e i Suoi limiti, il Suo team, endpoint dei webhook (mai un segreto), chiavi API (mai una chiave), il Suo registro di audit e i Suoi documenti. Viene generata in background, di solito in meno di un minuto; export.ready avvisa quando è pronta.
| Nome | Dove | Descrizione |
|---|---|---|
lang | body | La lingua del README: pt, es, en, fr, de, it o nl (predefinito en). |
Solo una chiave di produzione: una chiave sandbox risponde 403 export_live_key_required (il finanziatore dimostrativo è condiviso). Un’esportazione alla volta, al massimo 10 in 24 ore. La stessa esportazione è nella pagina Esportazione del portale, nelle impostazioni.
curl -s -X POST "$BASE/v1/exports" \
-H "Authorization: Bearer $ADVANTA_KEY" \
-H "Content-Type: application/json" \
-d '{"lang":"es"}'{
"funder": { "bank_id": "6d164c92-02cc-4f9a-ae8d-3f7f5ef043d3", "name": "Example Funder" },
"export": {
"id": "5e1f0a2b-3c4d-4e5f-8a9b-0c1d2e3f4a5b",
"subject": "funder",
"status": "queued",
"plane": "live",
"requested_via": "api",
"actor_role": "api:treasury",
"lang": "es",
"created_at": "2026-09-27T09:00:02.114000Z",
"download_available": false,
"manifest_sha256": null,
"progress": { "entities_done": 0, "entities_total": 47, "rows": 0, "volumes_written": 0, "phase": "data" }
}
}/v1/exportsLe Sue esportazioni, dal portale e dall’API, dalla più recente, con stato, dimensione e manifest_sha256.
| Nome | Dove | Descrizione |
|---|---|---|
limit | query | Da 1 a 200, predefinito 50. |
curl -s "$BASE/v1/exports?limit=20" \
-H "Authorization: Bearer $ADVANTA_KEY"/v1/exports/{id}Un’esportazione. Mentre viene generata: status queued o running, con progress. Una volta ready, e per 24 ore: files, ogni volume con un link valido al massimo un’ora (mai oltre quelle 24 ore). La richieda di nuovo per link nuovi; ogni chiamata che restituisce link viene registrata. Dopo 24 ore i file vengono cancellati e il record resta.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id dell’esportazione, da POST /v1/exports o GET /v1/exports. |
manifest_sha256 è lo SHA-256 di manifest.json scritto senza quel campo, con le chiavi ordinate e senza spazi. Advanta ha registrato lo stesso valore nella catena di prova (voce export.ready); verify.py lo ricalcola e controlla ogni file e le voci di prova.
curl -s "$BASE/v1/exports/5e1f0a2b-3c4d-4e5f-8a9b-0c1d2e3f4a5b" \
-H "Authorization: Bearer $ADVANTA_KEY"{
"funder": { "bank_id": "6d164c92-02cc-4f9a-ae8d-3f7f5ef043d3", "name": "Example Funder" },
"export": {
"id": "5e1f0a2b-3c4d-4e5f-8a9b-0c1d2e3f4a5b",
"status": "ready",
"completed_at": "2026-09-27T09:00:41.502000Z",
"expires_at": "2026-09-28T09:00:41.502000Z",
"download_available": true,
"manifest_sha256": "1c822b8797ba58903eca0689cc0c93138e7d396e01a038d133b5c1f3aeec7497",
"size_bytes": 482113,
"file_count": 101,
"documents_mode": "files",
"row_counts": { "requests": 212, "invoices": 1480, "evidence_entries": 903 }
},
"files": [
{
"name": "advanta-export-2026-09-27-5e1f0a2b-v001.zip",
"bytes": 482113,
"sha256": "9b0e5c1d2a7f4e6b8c3d1a0f9e8d7c6b5a4f3e2d1c0b9a8f7e6d5c4b3a291807",
"url": "https://…/object/sign/data-exports/…",
"url_expires_at": "2026-09-27T10:00:41.502000Z"
}
]
}# Every volume into one folder, then the checker the export carries
curl -s "$BASE/v1/exports/$EXPORT_ID" -H "Authorization: Bearer $ADVANTA_KEY" \
| jq -r '.files[].url' | while read -r u; do curl -s -o "v$((++n)).zip" "$u"; done
for z in v*.zip; do unzip -q -o "$z" -d export; done
python3 export/advanta-export-*/verify.py # files, manifest digest and evidence chain/v1/exports/{id}/documentsQuando i documenti erano troppo grandi per essere inclusi (documents_mode links): ogni documento dell’esportazione con un link valido per 15 minuti, una pagina alla volta. L’elenco viene calcolato al momento della richiesta: un documento che non può più leggere non compare.
| Nome | Dove | Descrizione |
|---|---|---|
id obbligatorio | path | L’id dell’esportazione. |
after | query | Il next_after della pagina precedente. |
limit | query | Da 1 a 200, predefinito 100. |
curl -s "$BASE/v1/exports/5e1f0a2b-3c4d-4e5f-8a9b-0c1d2e3f4a5b/documents?limit=100" \
-H "Authorization: Bearer $ADVANTA_KEY"Registri un endpoint HTTPS e Advanta gli invia un POST firmato quando succede qualcosa che La riguarda: su una richiesta a Lei assegnata o sul suo cedente, o su un link di onboarding che ha creato. Ogni endpoint si abbona ai tipi di evento di cui ha bisogno. Ogni consegna è firmata e, se non riesce, viene ritentata per 24 ore.
| Evento | Quando | data |
|---|---|---|
request.routed | Il team operativo di Advanta Le ha assegnato una richiesta. Ora può leggerla e decidere. | request_id, request_ref, type, status, total_amount, currency, routed_at |
request.unrouted | Una richiesta a Lei assegnata è stata assegnata altrove o ritirata. Non può più agire su di essa. | request_id, request_ref, unrouted_at |
offer.accepted | La Sua offerta è stata accettata (request_status è approved una volta che il cedente ha accettato). Può finanziarla. | offer_id, request_id, request_ref, request_status, rate, advance_pct, days, accepted_at |
notice.acknowledged | Un debitore ha confermato la notifica di cessione. Un evento per debitore; channel è online o offline. | notice_id, request_id, request_ref, debtor_name, debtor_tax_id, invoice_count, total_amount, channel, decided_at |
notice.disputed | Un debitore ha respinto la notifica di cessione. Un evento per debitore. | I campi di notice.acknowledged, più reason: le parole del debitore, al massimo 500 caratteri. |
request.funded | Una richiesta a Lei assegnata è stata finanziata. | I campi della richiesta di request.routed, più funded_at e advance_amount. |
settlement.recorded | È stato registrato denaro incassato su una richiesta finanziata, parziale o finale: il pagamento che chiude la richiesta ha final a true. | settlement_id, request_id, request_ref, amount, received_at, reference, received_total, request_total, outstanding, final, request_status |
seller.documents_expiring | Un documento con scadenza (per esempio un certificato di regolarità fiscale o contributiva) di un cedente con una richiesta aperta o finanziata a Lei assegnata scade tra 30 giorni, tra 7 giorni o oggi. Controllato ogni giorno; threshold_days è 30, 7 o 0. | seller_id, company_name, company_tax_id, document_id, document_type, valid_until, days_left, threshold_days, request_ids |
dispute.opened | Un debitore ha contestato fatture di una richiesta a Lei assegnata, dopo l’approvazione o il finanziamento. reason è goods_not_received, defective, amount_incorrect, already_paid, not_our_invoice o other; channel è cession_page, letter o email. | dispute_id, request_id, request_ref, notice_id, debtor_name, debtor_tax_id, invoice_numbers, reason, description, amount_disputed, channel, reported_by, received_on, request_status, status |
dispute.resolved | Il team operativo di Advanta ha chiuso una contestazione; status è resolved_for_debtor, resolved_for_seller o withdrawn. | I campi di dispute.opened, con il suo status, più resolved_at e resolution_note. |
onboarding.completed | Un fornitore che ha invitato con un link di onboarding ha inviato la verifica della sua azienda. status è completed; metadata sono i Suoi dati, come li ha inviati. Per un link creato con una chiave sandbox, lo ricevono solo gli endpoint di quella chiave. | onboarding_link_id, status, company_name, company_tax_id, country, seller_id, account_created_at, completed_at, verification_status, metadata |
client.joined | Un'azienda che ha invitato (per nome, con il suo link aperto, con il link di un segnalatore o tramite l'API) ha accettato l'invito ed è ora solo sua: le sue richieste arrivano solo a lei. origin dice come è arrivata (named, open_link, prescriber o api), con il segnalatore quando c'è. | seller_id, invitation_id, company_name, company_tax_id, country, origin, channel, link_id, prescriber_id, prescriber_name, arrived_at, joined_at, mode |
export.ready | Un’esportazione che ha richiesto (portale o API) è pronta: la scarichi con GET /v1/exports/{id} entro 24 ore. Porta il suo manifest_sha256, mai un link. | export_id, status, requested_via, manifest_sha256, size_bytes, file_count, documents_mode, volumes, completed_at, expires_at |
request.announced | Una richiesta confidenziale a Lei assegnata è stata notificata: da Lei, dalle operazioni di Advanta o da un evento che ha attivato (trigger è manual, overdue, dispute o kyc_lapsed). Le sue notifiche preparate sono in corso di invio; notices elenca ciascuna con lo SHA-256 del suo documento. | request_id, request_ref, trigger, reason, status, notices, announced_at |
recourse.opened | Una Sua richiesta finanziata non è saldata recourse_days dopo la scadenza di una fattura: una richiesta di regresso verso il cedente (kind recourse) o un inadempimento del debitore (kind debtor_default). | claim_id, request_id, request_ref, kind, claim_amount, funded_amount, fee_amount, collected_before, first_due_date, days_after_due, invoice_ids, pay_reference |
recourse.settled | Una richiesta di regresso è stata saldata: dai pagamenti che Lei ha registrato da quando si è aperta (via statement o manual; la richiesta si chiude come saldata per regresso), oppure perché la richiesta è stata saldata nel modo abituale (via request_settled, senza paid). | claim_id, request_id, request_ref, kind, claim_amount, paid, via, request_closed |
payment.reached_seller | Su un conto che il cedente condivide con Lei è arrivato un pagamento da un debitore di una richiesta che Lei ha finanziato a condizioni confidenziali: il riferimento riporta il numero di una fattura finanziata (match_rule invoice_reference), oppure pagatore e importo corrispondono (payer_and_amount). | alert_id, request_id, invoice_ids, payer_name, payer_iban, amount, currency, booking_date, match_rule, confidence |
opportunities.daily | Il riepilogo del mattino contiene qualcosa: fatture dei Suoi clienti diventate ammissibili dal riepilogo precedente, o un cambiamento in quelle che Le sono state mostrate. Solo un sommario, conteggi e totali, mai una fattura, un debitore o un cliente: legga le righe con GET /v1/opportunities?date= (lines). Al massimo uno al giorno; nessuno in un giorno senza nulla di nuovo e nulla di cambiato. | digest_id, date, stale, snapshot_at, clients (sharing, not_sharing), eligible (count, total), new (count, total), changes (paid, disputed, no_longer_eligible), currency, lines |
debtor.watch_blocked | Un bollettino ufficiale (il BORME per le società spagnole, Citius per quelle portoghesi) ha pubblicato un atto che blocca per nuovi finanziamenti un debitore di una richiesta che Lei ha finanziato: insolvenza dichiarata o in corso, liquidazione, insolvenza chiusa per mancanza di attivo, scioglimento, estinzione, o il foglio del registro chiuso dall’amministrazione fiscale o dopo un’insolvenza. Finché resta, nessuna nuova offerta e nessun nuovo finanziamento vanno alle fatture di questo debitore. Un evento per richiesta e per ogni passaggio a bloccato. È ciò che il bollettino ha pubblicato, da esaminare da parte Sua, non una conclusione giuridica; sono sorvegliate solo società in Spagna e Portogallo. | request_id, request_ref, debtor (country, tax_id, name), status, note, events (kind, published_on, source, url), detected_at |
pre_offer.accepted | Un cliente ha chiesto il finanziamento delle fatture di una pre-offerta che lei gli ha inviato dalle sue opportunità del mattino: la sua richiesta, fatta con tutti i controlli abituali, porta la pre-offerta e le arriva come sempre (request.routed), e la sua regola di credito prepara la sua offerta dalla sua tabella. terms è ciò che la sua tabella ha dato all’invio, indicativo: il prezzo è suo, Advanta non ne indica alcuno. Una volta per pre-offerta. | pre_offer_id, request_id, request_ref, seller_id, company_name, company_tax_id, invoice_ids, invoice_count, total_amount, currency, terms, sent_at, valid_until, accepted_at |
webhook.test | L’evento di test richiesto con POST /v1/webhooks/{id}/test. |
Ogni consegna è un POST con un body JSON, inviato byte per byte come è archiviato (il suo SHA-256 è nel registro di consegna), con tre header propri:
Advanta-Signature: t=<unix seconds>,v1=<hex>, vedi Verificare le firme.Advanta-Event-Id: l’id dell’evento, anche id nel body.Advanta-Event-Type: il tipo di evento, anche type nel body.POST /advanta HTTP/1.1
Host: hooks.example.com
Content-Type: application/json
Advanta-Signature: t=1790179835,v1=5f2b…
Advanta-Event-Id: 9b2f7f64-5a1c-4a57-9d8a-0f2e3c4b5a69
Advanta-Event-Type: request.funded{
"id": "9b2f7f64-5a1c-4a57-9d8a-0f2e3c4b5a69",
"object": "event",
"type": "request.funded",
"api_version": "2026-09-23",
"created": 1790179835,
"environment": "sandbox",
"data": {
"request_id": "4c1e0d2a-8f3b-4f6e-9a55-3c2b1d0e9f87",
"request_ref": "FR-2026-0042",
"type": "factoring",
"status": "funded",
"total_amount": 18450.00,
"currency": "EUR",
"funded_at": "2026-09-23T18:10:35Z",
"advance_amount": 16605.00
}
}| Campo | Significato |
|---|---|
id | L’id dell’evento, lo stesso di Advanta-Event-Id. |
object | Sempre event. |
type | Uno dei tipi di evento sopra. |
api_version | La revisione dell’API in cui è scritto l’evento. |
created | Quando l’evento è stato creato, in secondi Unix. |
environment | live, sandbox o unclassified, come in GET /v1/me. |
data | I campi dell’evento, elencati sopra. |
2xx entro 10 secondi e l’evento risulta consegnato. Qualsiasi altra risposta, nessuna risposta entro 10 secondi o un reindirizzamento è un errore; i reindirizzamenti non vengono mai seguiti.failed e resta nel registro di consegna.Advanta-Event-Id già elaborati e ignori una ripetizione.GET /v1/webhooks/{id}/deliveries mostra stato, tentativi, codice di risposta, ultimo errore e prossimo tentativo di ogni consegna. POST /v1/webhooks/{id}/test invia un evento webhook.test quando vuole controllare il Suo endpoint.https su un nome host pubblico, sulla porta 443, senza nome utente né password. Gli indirizzi privati, di loopback e link-local sono rifiutati.["*"] per tutti (predefinito).whsec_ seguito da 64 caratteri esadecimali) viene restituito una sola volta: alla creazione dell’endpoint e, di nuovo, a ogni rotazione. Lo custodisca come una password.POST /v1/webhooks/{id}/rotate-secret. Il segreto precedente continua a firmare, come secondo v1 nell’header, per keep_previous_hours (da 0 a 72, predefinito 24). Installi il nuovo segreto entro quel periodo e nessun evento va perso.Ogni consegna porta Advanta-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256>. La verifichi prima di fidarsi del body:
<t>.<raw body>, con il segreto dell’endpoint come chiave (l’intera stringa whsec_…, in UTF-8), e lo codifichi in esadecimale.v1 dell’header corrisponde, confrontato in tempo costante (dopo una rotazione ce ne sono due), e se t dista al massimo 300 secondi dal Suo orologio. Altrimenti la rifiuti.Una consegna rifiutata non risponde 2xx, quindi Advanta la ritenta come qualsiasi altro errore.
import crypto from 'node:crypto';
import express from 'express';
const TOLERANCE_SECONDS = 300;
// header: the Advanta-Signature value
// rawBody: the request body as a Buffer, exactly as received (before any JSON parsing)
// secret: your endpoint secret, the whole "whsec_…" string
export function verifyAdvantaSignature(header, rawBody, secret, nowSeconds = Math.floor(Date.now() / 1000)) {
let t = null;
const signatures = [];
for (const part of String(header ?? '').split(',')) {
const i = part.indexOf('=');
if (i <= 0) continue;
const key = part.slice(0, i).trim();
const value = part.slice(i + 1).trim();
if (key === 't' && /^[0-9]{1,12}$/.test(value)) t = Number(value);
else if (key === 'v1' && /^[0-9a-f]{64}$/.test(value)) signatures.push(value);
}
if (t === null || signatures.length === 0) return false;
if (Math.abs(nowSeconds - t) > TOLERANCE_SECONDS) return false; // replay window
const expected = crypto.createHmac('sha256', secret).update(`${t}.`).update(rawBody).digest();
// After a rotation the header carries two v1 values: accept either.
return signatures.some((sig) => crypto.timingSafeEqual(Buffer.from(sig, 'hex'), expected));
}
// Express: keep the body raw on this route.
const app = express();
app.post('/advanta', express.raw({ type: '*/*' }), (req, res) => {
if (!verifyAdvantaSignature(req.get('Advanta-Signature'), req.body, process.env.ADVANTA_WEBHOOK_SECRET)) {
return res.status(400).end();
}
const event = JSON.parse(req.body.toString('utf8'));
// Delivery is at least once: skip an event.id you already processed, then queue the work.
res.status(200).end();
});import hashlib
import hmac
import json
import os
import re
import time
from flask import Flask, request
TOLERANCE_SECONDS = 300
def verify_advanta_signature(header, raw_body, secret, now=None):
"""header: the Advanta-Signature value; raw_body: the request body as bytes, exactly
as received; secret: your endpoint secret, the whole "whsec_..." string."""
t = None
signatures = []
for part in (header or "").split(","):
key, sep, value = part.partition("=")
key, value = key.strip(), value.strip()
if not sep:
continue
if key == "t" and re.fullmatch(r"[0-9]{1,12}", value):
t = int(value)
elif key == "v1" and re.fullmatch(r"[0-9a-f]{64}", value):
signatures.append(value)
if t is None or not signatures:
return False
now = int(time.time()) if now is None else now
if abs(now - t) > TOLERANCE_SECONDS: # replay window
return False
expected = hmac.new(secret.encode("utf-8"), f"{t}.".encode("ascii") + raw_body, hashlib.sha256).hexdigest()
# After a rotation the header carries two v1 values: accept either.
return any(hmac.compare_digest(sig, expected) for sig in signatures)
# Flask
app = Flask(__name__)
@app.post("/advanta")
def advanta_webhook():
raw = request.get_data() # the raw bytes; do not read request.json before verifying
if not verify_advanta_signature(request.headers.get("Advanta-Signature"), raw, os.environ["ADVANTA_WEBHOOK_SECRET"]):
return "", 400
event = json.loads(raw)
# Delivery is at least once: skip an event["id"] you already processed, then queue the work.
return "", 200Ogni errore è JSON, con un code stabile e un message per le persone. Decida in base al codice, mai in base al messaggio.
{
"error": {
"code": "not_routed_to_you",
"message": "This request is not assigned to your institution. Advanta operations routes requests."
}
}| Stato | Codici | Significato |
|---|---|---|
| 400 | reason_required | Un rifiuto senza reason né notes. |
| 401 | unauthorized, key_expired | unauthorized: la chiave manca, è malformata, sconosciuta, revocata o inattiva. key_expired: la chiave è scaduta. |
| 403 | forbidden, not_your_request, export_live_key_required, not_routed_to_you, not_your_claim | forbidden: la chiave non ha l’ambito, o il finanziatore non è attivo. not_your_request: un incasso registrato da un finanziatore che non è quello della richiesta. export_live_key_required: una chiave sandbox non esporta. not_routed_to_you: notificare una richiesta che non è assegnata a Lei. not_your_claim: chiudere una richiesta di regresso che non riguarda una Sua richiesta. |
| 404 | not_found | Nessuna risorsa visibile per questa chiave, o un percorso sconosciuto. |
| 405 | method_not_allowed | Il metodo non è supportato su questo percorso. |
| 409 | not_routed_to_you, invalid_state, credit_limit, funding_gate_failed, funding_amount_mismatch, debtor_not_eligible_for_funder, documents_missing_for_funder, level_lower, notice_already_decided, not_factoring, request_not_in_flight, statement_already_imported, too_many_endpoints, prescriber_exists, link_exists, company_already_registered, email_has_account, invitation_pending_exists, country_not_served, export_in_progress, export_not_ready, export_failed | Una scrittura che la richiesta non consente: non è assegnata a Lei, lo stato non è quello giusto, supera uno dei Suoi limiti, una notifica di factoring non ancora confermata, un debitore fuori dalla Sua lista, un documento richiesto al cedente mancante o non più valido, oppure un livello di consenso che scenderebbe, arriva dopo la risposta di un debitore o riguarda una richiesta che non è di factoring o non è in corso. Inoltre un estratto già importato, più di 10 endpoint attivi, un nome di segnalatore che usa già, un link che funziona ancora (invii replace: true), e un link di onboarding per un’azienda o un contatto che ha già un account o un invito in attesa, o in un paese da cui Advanta non accetta ancora cedenti. Un’esportazione è ancora in corso di generazione (export_in_progress, export_not_ready) o non è riuscita (export_failed). |
| 410 | export_expired | export_expired: i file dell’esportazione si potevano scaricare per 24 ore; avvii una nuova esportazione. |
| 413 | file_too_large, too_many_lines, too_many_rows | L’estratto supera 4 MiB o ha più di 5.000 movimenti, oppure un’importazione di limiti ha più di 2.000 righe (too_many_rows). |
| 422 | invalid_terms, invalid_amount, invalid_received_at, invalid_funding_details, step_back_message_required, invalid_decision, level_invalid, invalid_flag, reason_required, debtor_tax_id_required, seller_id_required, invalid_limit, tax_id_required, file_required, file_unreadable, file_empty, statement_unreadable, statement_has_no_transactions, line_invalid, country_invalid, codes_invalid, note_invalid, country_without_catalogue, document_code_unknown, body_required, url_required, url_invalid, url_too_long, url_must_be_https, url_has_credentials, url_port_not_allowed, url_host_not_allowed, url_not_allowed, events_invalid, unknown_event_type, invalid_description, invalid_keep_previous_hours, body_invalid, name_required, name_invalid, email_invalid, email_not_reserved, notes_too_long, lang_invalid, prescriber_id_invalid, expires_at_invalid, replace_invalid, reason_invalid, company_vat_invalid, contact_email_invalid, contact_name_invalid, company_name_invalid, company_name_required, return_url_invalid, return_url_not_allowed, metadata_invalid, locale_invalid, valid_days_invalid, prescriber_not_found, country_not_served, seller_id_invalid, terms_invalid, terms_key_unknown, seller_not_in_programme, already_announced, request_closed, status_invalid, close_invalid, claim_closed, rows_required, invalid_source, source_ref_invalid, source_ref_too_long, invalid_date | Un campo o un parametro manca o non è valido; il codice dice quale. (Un rifiuto senza motivo è 400 reason_required; una modifica di impostazioni o di livello senza motivo è 422 reason_required.) Anche una modifica di condizioni per un’azienda fuori dal Suo programma (seller_not_in_programme), una richiesta già notificata o chiusa (already_announced, request_closed), e una richiesta di regresso non più aperta o chiusa nel modo sbagliato (claim_closed, close_invalid). Sono rifiutate anche un’importazione di limiti senza righe (rows_required), con una source diversa da import o insurer (invalid_source) o con una source_ref che non è testo o supera 200 caratteri (source_ref_invalid, source_ref_too_long), e una date delle opportunità che non è un giorno di calendario (invalid_date). |
| 429 | rate_limited, export_rate_limited | rate_limited: più chiamate del limite della chiave (120 al minuto e 3.000 all’ora, salvo che Advanta ne abbia fissato un altro per la chiave), o chiamate ripetute con una chiave sconosciuta dallo stesso indirizzo; la reinvii dopo Retry-After secondi. export_rate_limited: al massimo 10 esportazioni in 24 ore. |
| 500 | internal, query_failed, write_failed, ingest_failed | Qualcosa non ha funzionato dal lato di Advanta. Riprovi più tardi. |
debtor_not_eligible_for_funderQuando accetta solo acquirenti della Sua lista, un’offerta su una richiesta con un debitore fuori lista risponde 409 con i debitori che la bloccano, ciascuno con un reason:
{
"error": {
"code": "debtor_not_eligible_for_funder",
"message": "…",
"debtors": [
{
"debtor_key": "A00000000",
"name": "Example Buyer, S.A.",
"country": "ES",
"reason": "not_listed",
"invoices": 2
}
]
}
}| reason | Significato |
|---|---|
not_listed | Il debitore non è nella Sua lista. |
refused | Il Suo limite sul debitore è impostato come rifiutato. |
suspended | Il Suo limite sul debitore è sospeso. |
no_tax_id | Una fattura non ha il codice fiscale dell’acquirente. |
invoice_missing | Una riga della richiesta non ha una fattura. |
no_invoices | La richiesta non ha fatture. |
documents_missing_for_funderQuando un documento che richiede al cedente manca, non è verificato o non è più valido, un’offerta o un finanziamento risponde 409 con i documenti che lo bloccano, ciascuno con un reason:
{
"error": {
"code": "documents_missing_for_funder",
"message": "…",
"documents": [
{
"code": "cert_seguridad_social",
"name": "…",
"reason": "expired",
"valid_until": "2026-09-15",
"document_id": "5b7c9d1e-3f2a-4b6c-8d0e-1a2b3c4d5e6f"
}
]
}
}| reason | Significato |
|---|---|
missing | Il cedente non ha fornito il documento. |
unverified | Advanta non l’ha ancora verificato. |
expired | Non è più valido in quella data. |
rejected | Advanta l’ha respinto. |
no_validity_date | Non ha una data di validità. |
not_in_catalogue | Il codice non è nel catalogo del paese del cedente. |
Il percorso porta la versione principale, /v1. All’interno della v1 possono essere aggiunti campi e tipi di evento: ignori ciò che non conosce.
api_version, in GET /v1/me e in ogni evento webhook, indica la revisione che sta leggendo: oggi 2026-09-23.
Ogni chiave può fare 120 chiamate al minuto e 3.000 all’ora, contate su tutti i server di Advanta (il team operativo di Advanta può fissare un altro limite per una chiave). Una chiamata oltre il limite riceve 429 rate_limited, con un header Retry-After in secondi e retry_after_seconds, limit e window_seconds nell’errore: nulla di ciò che chiedeva è stato fatto, quindi la reinvii dopo quel tempo. Anche le chiamate ripetute con una chiave sconosciuta o malformata dallo stesso indirizzo ricevono 429. GET /v1/health non è limitato, e le esportazioni mantengono il loro limite (export_rate_limited).
Tutto ciò che è in questa pagina è descritto in openapi.yaml (OpenAPI 3.1). Domande, o una chiave: diogo@advanta.pt.