API per rivenditori

Un’unica API per ordini, portafoglio e il marketplace

Crea ordini, segui la consegna, leggi i saldi e gestisci gli annunci dal tuo sistema. Endpoint REST versionati, chiavi con permessi, scritture idempotenti e webhook firmati, sullo stesso motore che alimenta questo negozio.

  • REST /v1, JSON in entrata e in uscita
  • Chiavi Bearer con permessi
  • Idempotency-Key sulle scritture
  • Webhook firmati
  • Piano Rivenditore

Come funziona un’integrazione

Cinque chiamate, da zero a un ordine consegnato

L’API replica ciò che fa la dashboard, nello stesso ordine. Nulla viene addebitato finché non crei un ordine, e ogni scrittura è idempotente.

  1. Crea una chiave

    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.

  2. Leggi il catalogo

    GET /v1/catalog/services restituisce ogni servizio pubblicato con il prezzo già nella valuta e nel livello del tuo account.

  3. Visualizza il preventivo

    POST /v1/orders/preview valida link e quantità e restituisce l’addebito esatto senza creare nulla.

  4. Crea l’ordine

    POST /v1/orders con un Idempotency-Key. Il portafoglio viene addebitato e l’ordine viene instradato verso il fornitore con la migliore qualità misurata.

  5. Ascolta gli eventi

    Registra un endpoint https e ricevi eventi firmati per cambi di stato, consegne parziali, completamenti, rimborsi e ricariche.

Crea un ordine con una sola richiestabash
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

Chiavi che puoi limitare, restringere e ruotare

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.

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.

Allowlist IP

Puoi vincolare una chiave a un massimo di 20 indirizzi IP. Le richieste da altri indirizzi vengono rifiutate con 403 FORBIDDEN.

Limite di richieste per chiave

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

Permessi

Ogni chiave porta solo i permessi che concedi. Una chiamata fuori dai suoi permessi viene rifiutata con 403 FORBIDDEN.

PermessoCosa fa
catalog:readElencare servizi e prezzi
orders:readLeggere gli ordini
orders:writeCreare ordini, ricaricare e annullare
wallet:readLeggere i saldi
assets:readElencare i tuoi annunci e offerte
assets:writeCreare e modificare annunci, verifica e disponibilità
transactions:writeRegistrare i passaggi di consegna delle operazioni

In ogni risposta

  • X-Request-Id: indicalo quando contatti l’assistenza
  • X-Api-Version: la data del contratto con cui stai comunicando
  • Cache-Control: no-store, le risposte non vengono mai memorizzate nella cache

Idempotenza

Riprova in sicurezza, senza addebiti doppi

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.

  • Genera una chiave per ogni ordine logico (un UUID va benissimo) e salvala prima di inviare.
  • In caso di timeout o errore di rete, reinvia con la stessa chiave: otterrai il risultato originale.
  • Hai cambiato il corpo? Usa una nuova chiave. La vecchia resta legata alla prima richiesta.
Corpo dell’errorehttp
HTTP/1.1 409 Conflict
X-Request-Id: req_<hex>

{
  "error": {
    "code": "IDEMPOTENCY_KEY_REUSE",
    "message": "..."
  },
  "request_id": "req_<hex>"
}

Endpoint

Tutto ciò che il negozio può fare, via HTTP

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.

Specifica OpenAPI (YAML)

Catalogo

MetodoPercorsoPermessoCosa fa
GET/v1/catalog/platformscatalog:readPiattaforme con servizi attualmente pubblicati
GET/v1/catalog/servicescatalog:readServizi con il prezzo nella tua valuta e nel tuo livello; filtro per piattaforma
GET/v1/catalog/services/{id}catalog:readUn servizio con lo schema dei suoi campi

Ordini

MetodoPercorsoPermessoCosa fa
POST/v1/orders/previeworders:writeValida e quota senza creare né addebitare
POST/v1/ordersIdempotency-Key obbligatorioorders:writeCrea un ordine: addebita il portafoglio e instrada verso il miglior fornitore
GET/v1/ordersorders:readElenca gli ordini, dal più recente, con paginazione a cursore
POST/v1/orders/batchIdempotency-Key obbligatorioorders:writeFino a 100 ordini in una chiamata, ciascuno con il proprio risultato
GET/v1/orders/{id}orders:readRecupera un ordine per id
POST/v1/orders/{id}/refillorders:writeRichiedi una ricarica entro la finestra di garanzia
POST/v1/orders/{id}/cancelorders:writeRichiedi l’annullamento; rimborsato appena il fornitore conferma

Portafoglio

MetodoPercorsoPermessoCosa fa
GET/v1/wallet/balancewallet:readSaldi per valuta: disponibile, denaro, bonus e riservato

Asset (venditori)

MetodoPercorsoPermessoCosa fa
POST/v1/assetsassets:writeCrea una bozza di annuncio; va online dopo verifica e moderazione
GET/v1/assetsassets:readI tuoi annunci
PATCH/v1/assets/{id}assets:writeAggiorna un annuncio (corpo completo; If-Match per il locking ottimistico)
POST/v1/assets/batchassets:writeImporta fino a 1.000 annunci, abbinati tramite external_ref
POST/v1/assets/{id}/verifyassets:writeAvvia (method) o controlla (verification_id) una verifica di proprietà
POST/v1/assets/{id}/availabilityassets:writeNascondi o mostra un annuncio (non durante una trattativa)

Offerte

MetodoPercorsoPermessoCosa fa
GET/v1/offersassets:readOfferte ricevute sui tuoi annunci

Operazioni

MetodoPercorsoPermessoCosa fa
POST/v1/transactions/{id}/handofftransactions:writeSegna un passaggio del protocollo, aggiungi un elemento sicuro o completa la consegna
Risposta (201)http
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

Eventi firmati, consegnati finché non li confermi

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.

Header di consegnahttp
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", ... } }
Verifica in Node.jsjs
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));
}

Verifica una firma

  1. Leggi Webhook-Timestamp (t) e il corpo grezzo della richiesta esattamente come ricevuto.
  2. Calcola HMAC-SHA256 con il segreto del tuo endpoint sulla stringa «t.body».
  3. Confrontalo in tempo costante con il valore v1 di Webhook-Signature.
  4. Rifiuta i timestamp più vecchi di 5 minuti e deduplica per Webhook-Id.
  5. Rispondi 2xx rapidamente e svolgi il lavoro in modo asincrono.

Tentativi e outbox

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.

Eventi a cui puoi abbonarti

  • order.created
  • order.status_changed
  • order.partial
  • order.completed
  • order.refunded
  • order.refill_updated
  • deposit.confirmed
  • offer.created
  • offer.updated
  • reservation.created
  • transaction.updated
  • payout.updated
  • listing.updated
  • dispute.updated

Regole degli endpoint

  • Solo https:// su un host pubblico; gli indirizzi privati e interni vengono rifiutati.
  • Abbonati a eventi specifici oppure a tutti.
  • Il segreto di firma viene mostrato una sola volta, alla creazione.

Compatibilità

Aggiungi questo negozio a qualsiasi pannello SMM

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" }.

Azioni supportate

  • services: il catalogo con tariffa, min, max e indicatori di ricarica e annullamento
  • add: crea un ordine (servizio, link, quantità, commenti, nomi utente, esecuzioni, intervallo)
  • status: un ordine, oppure fino a 100 con orders=id1,id2
  • balance: saldo disponibile nella valuta del tuo account
  • refill: richiede ricariche per uno o più ordini
  • refill_status: stato di una o più ricariche
  • cancel: richiede l’annullamento di uno o più ordini

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.

Richiestabash
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

Una sola forma per ogni errore

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.

Corpo dell’errorehttp
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>"
}
CodiceHTTPSignificato
VALIDATION_ERROR400Corpo o header non validi; details.fields elenca ogni percorso e problema
UNAUTHORIZED401Chiave mancante, non valida, revocata o scaduta
INSUFFICIENT_FUNDS402Saldo del portafoglio insufficiente per il preventivo
FORBIDDEN403La chiave non ha il permesso, IP non consentito, sottoutente senza autorizzazione o account sospeso
NOT_FOUND404Ordine, servizio o annuncio inesistente per questo account
CONFLICT409Conflitto di stato, come il limite di chiavi attive
INVALID_TRANSITION409L’ordine o l’operazione non può passare a quello stato
DUPLICATE_ORDER409Stesso servizio, link e quantità nella finestra dei duplicati
IDEMPOTENCY_KEY_REUSE409Idempotency-Key già usata con un corpo diverso
ALREADY_RESERVED409L’asset è riservato da un altro acquirente
POLICY_BLOCKED422Servizio o paese bloccato dalla policy della piattaforma
MARGIN_GUARD422Nessun fornitore può evadere questo ordine al prezzo pubblicato
UNPROCESSABLE422La richiesta è valida ma non può essere eseguita
RATE_LIMITED429Limite per chiave raggiunto; attendi i secondi indicati in Retry-After
INTERNAL500Errore imprevisto; contatta l’assistenza con il request_id
PROVIDER_ERROR502Errore del fornitore a monte; l’ordine viene ritentato o rimborsato
NO_ROUTE503Nessun instradamento verso un fornitore disponibile ora; riprova più tardi
NOT_CONFIGURED503Funzione non configurata su questo negozio

Chi può usarla

Disponibile nel piano Rivenditore

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.

Creare un’integrazione da rivenditore con l’API di SocialMediaPRO

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.

Un solo contratto, versionato per data

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.

Chiavi, autorizzazioni e l’account per cui agiscono

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.

Scritture idempotenti e lotti

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.

  • Genera un UUID per ogni ordine logico e salvalo prima dell’invio.
  • In caso di timeout, reinvia con la stessa chiave; non generarne mai una nuova per lo stesso ordine.
  • Considera i codici 4xx come definitivi e i codici 5xx e 429 come ritentabili con attesa crescente.

Webhook di cui puoi fidarti

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.

Pannelli figli tramite l’endpoint SMM v2

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.

Domande frequenti

Quale piano mi serve per usare l’API?

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.

Come autentico una richiesta?

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.

Cosa succede se la mia richiesta va in timeout dopo aver creato un ordine?

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.

Come verifico un webhook?

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.

Qual è il limite di richieste?

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.

I prezzi nell’API sono uguali a quelli del sito?

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.

Posso usare l’API per le inserzioni del marketplace?

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.

Pronto a integrare?

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.