Chiavi Bearer
Invia Authorization: Bearer smp_live_… oppure X-Api-Key. La chiave completa viene mostrata una sola volta e viene salvato solo il suo hash. Fino a 20 chiavi attive per account, data di scadenza facoltativa e rotazione con un clic.
Come funziona un’integrazione
L’API replica ciò che fa la dashboard, nello stesso ordine. Nulla viene addebitato finché non crei un ordine, e ogni scrittura è idempotente.
Nella dashboard scegli i permessi di cui la chiave ha bisogno e, facoltativamente, gli IP autorizzati a usarla. La chiave completa viene mostrata una sola volta.
GET /v1/catalog/services restituisce ogni servizio pubblicato con il prezzo già nella valuta e nel livello del tuo account.
POST /v1/orders/preview valida link e quantità e restituisce l’addebito esatto senza creare nulla.
POST /v1/orders con un Idempotency-Key. Il portafoglio viene addebitato e l’ordine viene instradato verso il fornitore con la migliore qualità misurata.
Registra un endpoint https e ricevi eventi firmati per cambi di stato, consegne parziali, completamenti, rimborsi e ricariche.
curl -X POST https://YOUR-DOMAIN/v1/orders \
-H "Authorization: Bearer smp_live_xxxxxxxxxx_..." \
-H "Idempotency-Key: 2b7c1d9e-order-1001" \
-H "Content-Type: application/json" \
-d '{"service":"<service_id>","link":"https://instagram.com/p/abc","quantity":1000}'Sostituisci YOUR-DOMAIN con l’host di questo negozio, la chiave con la tua e <service_id> con un id del catalogo.
Autenticazione e limiti
Una chiave è una credenziale lato server. Non finisce mai in un browser, porta solo i permessi che concedi e puoi revocarla o ruotarla in qualsiasi momento senza toccare le altre chiavi.
Invia Authorization: Bearer smp_live_… oppure X-Api-Key. La chiave completa viene mostrata una sola volta e viene salvato solo il suo hash. Fino a 20 chiavi attive per account, data di scadenza facoltativa e rotazione con un clic.
Puoi vincolare una chiave a un massimo di 20 indirizzi IP. Le richieste da altri indirizzi vengono rifiutate con 403 FORBIDDEN.
Ogni chiave eredita il limite di richieste al minuto del livello cliente del tuo account. Ogni risposta riporta RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset; oltre il limite ricevi 429 con Retry-After.
Limite in vigore per il livello Rivenditore1200 richieste al minuto
Ogni chiave porta solo i permessi che concedi. Una chiamata fuori dai suoi permessi viene rifiutata con 403 FORBIDDEN.
| Permesso | Cosa fa |
|---|---|
catalog:read | Elencare servizi e prezzi |
orders:read | Leggere gli ordini |
orders:write | Creare ordini, ricaricare e annullare |
wallet:read | Leggere i saldi |
assets:read | Elencare i tuoi annunci e offerte |
assets:write | Creare e modificare annunci, verifica e disponibilità |
transactions:write | Registrare i passaggi di consegna delle operazioni |
Idempotenza
POST /v1/orders e POST /v1/orders/batch richiedono un header Idempotency-Key di 8–120 caratteri. Ripetere una chiamata con la stessa chiave restituisce lo stesso ordine senza addebitare di nuovo. Riutilizzare una chiave con un corpo diverso viene rifiutato con 409 IDEMPOTENCY_KEY_REUSE. In un batch, ogni elemento è identificato dalla chiave del batch più il suo indice.
HTTP/1.1 409 Conflict
X-Request-Id: req_<hex>
{
"error": {
"code": "IDEMPOTENCY_KEY_REUSE",
"message": "..."
},
"request_id": "req_<hex>"
}Endpoint
Tutti i percorsi stanno sotto /v1 sull’host di questo negozio. Gli importi sono sempre stringhe decimali con una valuta ISO 4217, mai numeri in virgola mobile. Gli schemi completi di richiesta e risposta sono nel file OpenAPI.
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| GET | /v1/catalog/platforms | catalog:read | Piattaforme con servizi attualmente pubblicati |
| GET | /v1/catalog/services | catalog:read | Servizi con il prezzo nella tua valuta e nel tuo livello; filtro per piattaforma |
| GET | /v1/catalog/services/{id} | catalog:read | Un servizio con lo schema dei suoi campi |
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| POST | /v1/orders/preview | orders:write | Valida e quota senza creare né addebitare |
| POST | /v1/ordersIdempotency-Key obbligatorio | orders:write | Crea un ordine: addebita il portafoglio e instrada verso il miglior fornitore |
| GET | /v1/orders | orders:read | Elenca gli ordini, dal più recente, con paginazione a cursore |
| POST | /v1/orders/batchIdempotency-Key obbligatorio | orders:write | Fino a 100 ordini in una chiamata, ciascuno con il proprio risultato |
| GET | /v1/orders/{id} | orders:read | Recupera un ordine per id |
| POST | /v1/orders/{id}/refill | orders:write | Richiedi una ricarica entro la finestra di garanzia |
| POST | /v1/orders/{id}/cancel | orders:write | Richiedi l’annullamento; rimborsato appena il fornitore conferma |
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| GET | /v1/wallet/balance | wallet:read | Saldi per valuta: disponibile, denaro, bonus e riservato |
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| POST | /v1/assets | assets:write | Crea una bozza di annuncio; va online dopo verifica e moderazione |
| GET | /v1/assets | assets:read | I tuoi annunci |
| PATCH | /v1/assets/{id} | assets:write | Aggiorna un annuncio (corpo completo; If-Match per il locking ottimistico) |
| POST | /v1/assets/batch | assets:write | Importa fino a 1.000 annunci, abbinati tramite external_ref |
| POST | /v1/assets/{id}/verify | assets:write | Avvia (method) o controlla (verification_id) una verifica di proprietà |
| POST | /v1/assets/{id}/availability | assets:write | Nascondi o mostra un annuncio (non durante una trattativa) |
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| GET | /v1/offers | assets:read | Offerte ricevute sui tuoi annunci |
| Metodo | Percorso | Permesso | Cosa fa |
|---|---|---|---|
| POST | /v1/transactions/{id}/handoff | transactions:write | Segna un passaggio del protocollo, aggiungi un elemento sicuro o completa la consegna |
HTTP/1.1 201 Created
X-Request-Id: req_<hex>
X-Api-Version: 2026-09-23
RateLimit-Limit: <limit> RateLimit-Remaining: <n> RateLimit-Reset: <seconds>
{
"id": "SMP-7K2Q9XHT",
"status": "routing",
"service": "<service_id>",
"link": "https://instagram.com/p/abc",
"quantity": 1000,
"charge": "<decimal>",
"refunded": "0",
"currency": "USD",
"start_count": null,
"remains": null,
"delivered": null,
"refill_until": null,
"created_at": "2026-09-23T12:00:00.000Z",
"updated_at": "2026-09-23T12:00:00.000Z"
}Webhook
Registra un endpoint https su un host pubblico e scegli gli eventi che ti interessano. Ogni consegna è firmata con il segreto del tuo endpoint, mostrato una sola volta alla creazione.
POST /webhooks/orders HTTP/1.1
Content-Type: application/json
Webhook-Id: <event id>
Webhook-Timestamp: 1790000000
Webhook-Signature: t=1790000000,v1=<hex HMAC-SHA256(secret, "1790000000.<body>")>
{ "id": "<event id>", "type": "order.partial", "created_at": "2026-09-23T12:05:00.000Z",
"data": { "orderId": "SMP-7K2Q9XHT", ... } }import { createHmac, timingSafeEqual } from 'node:crypto';
export function verifyWebhook(secret, headers, rawBody) {
const t = headers['webhook-timestamp'];
const v1 = (headers['webhook-signature'] ?? '')
.split(',').find((p) => p.startsWith('v1='))?.slice(3) ?? '';
const expected = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300; // 5 minutes
return fresh && expected.length === v1.length
&& timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}Gli eventi vengono scritti in un outbox nella stessa transazione del database della modifica che li ha generati, quindi nulla va perso se una consegna fallisce. Le consegne fallite vengono ritentate dopo 1 min, 5 min, 30 min, 2 h, 6 h, 12 h e 24 h prima di essere segnate come definitivamente fallite.
order.createdorder.status_changedorder.partialorder.completedorder.refundedorder.refill_updateddeposit.confirmedoffer.createdoffer.updatedreservation.createdtransaction.updatedpayout.updatedlisting.updateddispute.updatedCompatibilità
POST /api/v2 implementa il contratto comune «SMM API v2»: invia chiave e azione come campi di form o JSON. Stesse chiavi, permessi e limiti di /v1; cambia solo il formato, e gli errori tornano come { "error": "message" }.
I pannelli non inviano una chiave di idempotenza, quindi se ne deriva una dal contenuto dell’ordine e dal minuto corrente; la finestra dei duplicati copre il resto.
curl -X POST https://YOUR-DOMAIN/api/v2 \
-d key=smp_live_xxxxxxxxxx_... \
-d action=add \
-d service=<service_id> \
-d link=https://instagram.com/p/abc \
-d quantity=1000
{ "order": "SMP-7K2Q9XHT" }Errori
Ogni risposta non 2xx ha lo stesso corpo. Integrati sul codice, non sul messaggio: i messaggi possono cambiare, i codici no. Il request_id viene inviato anche nell’header X-Request-Id.
HTTP/1.1 400 Bad Request
X-Request-Id: req_<hex>
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request.",
"details": {
"fields": [{ "path": "quantity", "message": "..." }]
}
},
"request_id": "req_<hex>"
}| Codice | HTTP | Significato |
|---|---|---|
VALIDATION_ERROR | 400 | Corpo o header non validi; details.fields elenca ogni percorso e problema |
UNAUTHORIZED | 401 | Chiave mancante, non valida, revocata o scaduta |
INSUFFICIENT_FUNDS | 402 | Saldo del portafoglio insufficiente per il preventivo |
FORBIDDEN | 403 | La chiave non ha il permesso, IP non consentito, sottoutente senza autorizzazione o account sospeso |
NOT_FOUND | 404 | Ordine, servizio o annuncio inesistente per questo account |
CONFLICT | 409 | Conflitto di stato, come il limite di chiavi attive |
INVALID_TRANSITION | 409 | L’ordine o l’operazione non può passare a quello stato |
DUPLICATE_ORDER | 409 | Stesso servizio, link e quantità nella finestra dei duplicati |
IDEMPOTENCY_KEY_REUSE | 409 | Idempotency-Key già usata con un corpo diverso |
ALREADY_RESERVED | 409 | L’asset è riservato da un altro acquirente |
POLICY_BLOCKED | 422 | Servizio o paese bloccato dalla policy della piattaforma |
MARGIN_GUARD | 422 | Nessun fornitore può evadere questo ordine al prezzo pubblicato |
UNPROCESSABLE | 422 | La richiesta è valida ma non può essere eseguita |
RATE_LIMITED | 429 | Limite per chiave raggiunto; attendi i secondi indicati in Retry-After |
INTERNAL | 500 | Errore imprevisto; contatta l’assistenza con il request_id |
PROVIDER_ERROR | 502 | Errore del fornitore a monte; l’ordine viene ritentato o rimborsato |
NO_ROUTE | 503 | Nessun instradamento verso un fornitore disponibile ora; riprova più tardi |
NOT_CONFIGURED | 503 | Funzione non configurata su questo negozio |
Chi può usarla
Le chiavi API e gli endpoint webhook vengono creati dal titolare dell’account nel piano Rivenditore. Gli ordini effettuati con una chiave vengono addebitati sul portafoglio dell’account e compaiono nella stessa dashboard degli ordini manuali. I sottoutenti non possono creare chiavi.
Che tu gestisca un pannello che ha bisogno di un fornitore affidabile, uno strumento di agenzia che effettua ordini per i clienti o un inventario di venditore che deve restare sincronizzato con il marketplace, l’integrazione segue lo stesso schema: una chiave con ambito limitato, scritture idempotenti ed eventi che verifichi prima di fidarti di loro.
Ogni endpoint si trova sotto /v1 sul dominio della vetrina con cui integri. Le risposte sono in JSON, gli importi sono stringhe decimali associate a una valuta ISO 4217 e i timestamp seguono il formato ISO 8601. Ogni risposta riporta un’intestazione X-Api-Version con la data del contratto con cui stai comunicando e un X-Request-Id che puoi citare al supporto. Gli errori hanno sempre lo stesso corpo: un oggetto error con un codice stabile, un messaggio leggibile e dettagli facoltativi, insieme al request_id.
Il file OpenAPI 3.1 descrive ogni percorso, schema e codice di errore. Importalo nel tuo client HTTP o nel generatore di codice e otterrai richieste tipizzate per catalogo, ordini, portafoglio, inserzioni, offerte e consegne delle operazioni.
La chiave è creata dal titolare dell’account nel piano Rivenditore e viene mostrata una sola volta; viene memorizzato solo un hash. Al momento della creazione scegli le sue autorizzazioni, un elenco facoltativo di IP consentiti (fino a 20 indirizzi) e una scadenza facoltativa. La rotazione crea una nuova chiave con le stesse autorizzazioni e revoca la precedente, così puoi sostituire le credenziali senza interruzioni. Gli ordini effettuati con una chiave vengono addebitati sul portafoglio dell’account e compaiono nella stessa dashboard degli ordini manuali, con la fonte indicata come API.
Ogni chiave eredita il limite di richieste al minuto del livello cliente dell’account. Le intestazioni RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset indicano a che punto sei; superato il limite l’API risponde con 429 e un’intestazione Retry-After, e la reazione corretta è attendere esattamente quel tempo.
La creazione di un ordine è l’unica chiamata che muove denaro, quindi è protetta due volte. Primo, l’intestazione Idempotency-Key è obbligatoria: ripetere una richiesta con la stessa chiave restituisce l’ordine originale senza un secondo addebito, e riutilizzare la chiave con un corpo diverso viene rifiutato con 409 IDEMPOTENCY_KEY_REUSE. Secondo, una finestra anti-duplicati individua lo stesso servizio, link e quantità inviati di nuovo in un intervallo breve senza corrispondenza della chiave, e restituisce 409 DUPLICATE_ORDER.
I lotti accettano fino a 100 ordini per chiamata. Ogni elemento viene validato e addebitato singolarmente, identificato dalla chiave del lotto più il suo indice, e la risposta riporta un risultato per elemento, così una riga difettosa non blocca mai le altre. Usa prima POST /v1/orders/preview quando vuoi l’addebito esatto e il risultato della validazione senza creare nulla.
Ogni cambio di stato viene scritto in una coda nella stessa transazione di database del cambio stesso, e un distributore lo consegna al tuo endpoint https con tre intestazioni: Webhook-Id, Webhook-Timestamp e Webhook-Signature. La firma è un HMAC-SHA256 del timestamp, di un punto e del corpo grezzo, calcolato con il segreto dell’endpoint mostrato una sola volta alla creazione. Verificala in tempo costante, rifiuta i timestamp più vecchi di cinque minuti e deduplica per Webhook-Id, perché un evento ritentato porta lo stesso id.
Le consegne che non ricevono un 2xx vengono ritentate dopo 1 minuto, 5 minuti, 30 minuti, 2 ore, 6 ore, 12 ore e 24 ore, prima di essere contrassegnate come fallite in modo definitivo. Rispondi rapidamente ed elabora in modo asincrono; un gestore lento è la causa più frequente di elaborazione duplicata.
Se il tuo pannello parla già il formato diffuso “SMM API v2”, puoi aggiungere questa vetrina come fornitore incollando l’URL /api/v2 e la tua chiave. Sono supportate le azioni services, add, status, balance, refill, refill_status e cancel, i prezzi tornano nella valuta e nel livello del tuo account, e gli errori usano la forma piatta { "error": "messaggio" } che questi pannelli si aspettano. L’idempotenza deriva dal contenuto dell’ordine e dal minuto corrente, quindi gli invii doppi accidentali nello stesso minuto vengono unificati.
Il piano Rivenditore. Le chiavi API e gli endpoint dei webhook sono creati dal titolare dell’account; i subutenti non possono crearli. Le chiavi sono credenziali lato server e non devono mai essere incorporate in un browser o in un’app mobile.
Invia la chiave come Authorization: Bearer smp_live_… oppure nell’intestazione X-Api-Key. La chiave deve avere l’ambito richiesto dall’endpoint, come orders:write per creare un ordine o catalog:read per elencare i servizi.
Reinviala con la stessa Idempotency-Key. Ricevi l’ordine originale e nulla viene addebitato due volte. Se invii un corpo diverso con la stessa chiave, l’API risponde con 409 IDEMPOTENCY_KEY_REUSE.
Calcola HMAC-SHA256 con il segreto del tuo endpoint sulla stringa formata da Webhook-Timestamp, un punto e il corpo grezzo, poi confrontala in tempo costante con il valore v1 di Webhook-Signature. Rifiuta i timestamp più vecchi di 5 minuti e deduplica per Webhook-Id.
Ogni chiave eredita il limite di richieste al minuto del tuo livello cliente, indicato in questa pagina. Le intestazioni RateLimit-* segnalano la finestra corrente e una risposta 429 include Retry-After in secondi.
Sì. GET /v1/catalog/services restituisce il prezzo già convertito nella valuta del tuo account con lo sconto del tuo livello, e POST /v1/orders/preview restituisce l’addebito esatto, inclusi sconti per volume e coupon, prima che tu confermi.
Sì. Con l’ambito assets:write puoi creare e aggiornare inserzioni, importarne fino a 1.000 in una volta, avviare la verifica della proprietà e cambiare la disponibilità; assets:read elenca le tue inserzioni e offerte, e transactions:write registra i passaggi della consegna su una trattativa.
Nel piano Rivenditore crea una chiave, scarica il file OpenAPI e invia il primo ordine dal tuo sistema.
Non vendiamo mai recensioni o valutazioni. Alcune piattaforme limitano nei loro termini i servizi di engagement o i trasferimenti di account; sei responsabile delle regole di ciascuna piattaforma che usi.