API Piani
🤖 Spiega con l'intelligenza artificiale
L’API Piani è progettata per gestire i piani di abbonamento in modo efficiente. Supporta la creazione di piani, l’elencazione di tutti i piani, il recupero tramite ID, la modifica e l’eliminazione, consentendo una gestione fluida delle iscrizioni.
L’API garantisce risposte chiare e coerenti, inclusa una gestione dettagliata degli errori, per fornire un’esperienza ottimale agli sviluppatori.
Creare un piano¶
Endpoint
POST /v1/plans/
Questo endpoint consente di creare un nuovo piano ricorrente nel sistema inviando una richiesta POST con i dettagli del piano, come nome, descrizione, importo, valuta, intervallo (frequenza di fatturazione), trial_period_days e un’immagine opzionale. Se l’operazione ha successo, conferma la creazione del piano e fornisce la sua chiave univoca.
Parametri di query:
| Parametro | Descrizione | Tipo | Obbligatorio |
|---|---|---|---|
| test | Indica se il piano è in modalità test | boolean | false |
Campi del corpo della richiesta:
| Parametro | Descrizione | Tipo | Obbligatorio |
|---|---|---|---|
| name | Nome del piano (max 50 caratteri) | string | true |
| description | Descrizione del piano (max 300 caratteri) | string | false |
| currency | Codice valuta (USD, EUR, CRC, ecc.) | string | true |
| amount | Prezzo del piano (formato decimale) | decimal | true |
| interval | Frequenza di fatturazione (month, year) | string | true |
| interval_count | Numero di intervalli tra le fatturazioni | integer | true |
| trial_period_days | Periodo di prova in giorni | integer | false |
| image | Immagine codificata in Base64 o URL immagine | string | false |
Richiesta (cURL):
curl -X POST 'https://api.4geeks.io/v1/plans/?test=false' \
-H 'Authorization: Api-Key sk_test_51O62xYzAbcDef123' \
-H 'Content-Type: application/json' \
-d '{
"name": "Premium Plan",
"description": "Unlimited access to all features",
"currency": "USD",
"amount": 9.99,
"interval": "month",
"interval_count": 1,
"trial_period_days": 7,
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg..."
}'
Richiesta (Python):
import requests
api_key = "sk_test_51O62xYzAbcDef123"
response = requests.post(
'https://api.4geeks.io/v1/plans/?test=false',
headers={
'Authorization': f'Api-Key {api_key}',
'Content-Type': 'application/json'
},
json={
"name": "Premium Plan",
"description": "Unlimited access to all features",
"currency": "USD",
"amount": 9.99,
"interval": "month",
"interval_count": 1,
"trial_period_days": 7
}
)
print(response.json())
Richiesta (Postman):
- Metodo: POST
- URL:
https://api.4geeks.io/v1/plans/?test=false - Autorizzazione: Api-Key con valore
sk_test_51O62xYzAbcDef123 - Corpo (raw JSON):
{
"name": "Premium Plan",
"description": "Unlimited access to all features",
"currency": "USD",
"amount": 9.99,
"interval": "month",
"interval_count": 1,
"trial_period_days": 7
}
Risposta (201 Created):
{
"code": 201,
"title": "Registrazione completata",
"content": "La registrazione è stata completata con successo.",
"type": "success",
"data": {
"id": "d36a4a5c-9fa9-4d55-b47f-4f1d50f2a180"
}
}
Ottenere tutti i piani¶
Endpoint
GET /v1/plans/
Questo endpoint recupera un elenco paginato di tutti i piani con supporto per il filtraggio avanzato.
Parametri di query:
| Parametro | Descrizione | Tipo | Obbligatorio |
|---|---|---|---|
| page | Numero di pagina per la paginazione (default: 1) | integer | false |
| page_size | Numero di piani per pagina (default: 10, max: 100) | integer | false |
| test | Filtra per modalità test (true/false) | boolean | false |
| name | Cerca per nome del piano | string | false |
| price_min | Prezzo minimo del piano | decimal | false |
| price_max | Prezzo massimo del piano | decimal | false |
| interval | Filtra per intervallo di fatturazione (month, year) | string | false |
| interval_count | Filtra per numero di intervalli | integer | false |
| subscribers_min | Numero minimo di abbonati attivi | integer | false |
| subscribers_max | Numero massimo di abbonati attivi | integer | false |
| trial_days | Filtra per giorni del periodo di prova | integer | false |
| status | Filtra per stato (active/inactive, true/false) | string | false |
Richiesta (Elenca tutti i piani):
curl -X GET 'https://api.4geeks.io/v1/plans/?page=1&page_size=10&test=false' \
-H 'Authorization: Api-Key sk_test_51O62xYzAbcDef123'
Richiesta (Con filtri):
curl -X GET 'https://api.4geeks.io/v1/plans/?page=1&name=premium&price_min=5&price_max=50&status=active' \
-H 'Authorization: Api-Key sk_test_51O62xYzAbcDef123'
Risposta (200 OK):
{
"count": 2,
"current_page": 1,
"total_pages": 1,
"results": [
{
"key": "f1a2b3c4-5678-90ab-cdef-1234567890ab",
"information": {
"name": "Premium Plan",
"created": "2025-08-17T20:00:00Z",
"interval": "month",
"interval_count": 1,
"currency": "USD",
"amount": "9.99",
"trial_period_days": 7,
"credit_card_description": "PREMIUM",
"description": "Unlimited access to all features with premium support.",
"email": "developer@example.com",
"company_name": "Acme Corp",
"page": "https://acme.com",
"active": true,
"count": 150,
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...",
"image_dev": "https://acme.com/logo.png"
},
"test": false
},
{
"key": "a1b2c3d4-5678-90ef-ghij-1234567890cd",
"information": {
"name": "Basic Plan",
"created": "2025-08-17T20:05:00Z",
"interval": "month",
"interval_count": 1,
"currency": "USD",
"amount": "4.99",
"trial_period_days": 0,
"credit_card_description": "BASIC",
"description": "Limited access to basic features with standard support.",
"email": "developer@example.com",
"company_name": "Acme Corp",
"page": "https://acme.com",
"active": true,
"count": 45,
"image": null,
"image_dev": "https://acme.com/logo.png"
},
"test": false
}
]
}
Ottenere un piano specifico¶
Endpoint
GET /v1/plans/{id}/
Questo endpoint recupera i dettagli completi di un piano specifico tramite la sua chiave univoca.
Parametri di percorso:
| Parametro | Descrizione | Tipo | Obbligatorio |
|---|---|---|---|
| id | L’identificatore univoco di un piano (chiave) | string | true |
Parametri di query:
| Parametro | Descrizione | Tipo | Obbligatorio |
|---|---|---|---|
| test | Filtra per modalità test (true/false) | boolean | false |
Richiesta:
curl -X GET 'https://api.4geeks.io/v1/plans/f9b77185-a62e-4da9-a056-3c7b812ca334/' \
-H 'Authorization: Api-Key sk_test_51O62xYzAbcDef123'
Risposta (200 OK):
{
"key": "f9b77185-a62e-4da9-a056-3c7b812ca334",
"information": {
"name": "Standard Plan",
"created": "2025-03-25T08:50:15.732299Z",
"interval": "month",
"interval_count": 1,
"currency": "USD",
"amount": "19.99",
"trial_period_days": 0,
"credit_card_description": "STANDARD",
"description": "This plan offers access to standard features with basic support.",
"email": "developer@example.com",
"company_name": "Acme Corp",
"page": "https://acme.com",
"active": true,
"count": 75,
"image": null,
"image_dev": "https://acme.com/logo.png"
},
"test": true
}
Risposta (404 Not Found):
{
"code": 404,
"title": "Il piano non esiste",
"content": "Il piano richiesto non esiste, per favore verifica.",
"type": "danger"
}
Aggiornare un piano¶
Endpoint
PUT /v1/plans/{id}/
Aggiorna un piano esistente con nuovi dettagli. È possibile aggiornare i singoli campi tra cui nome, descrizione, immagine e giorni del periodo di prova senza influenzare gli altri.
Parametri di percorso:
| Parametro | Descrizione | Tipo | Obbligatorio |
|---|---|---|---|
| id | L’identificatore univoco di un piano (chiave) | string | true |
Parametri di query:
| Parametro | Descrizione | Tipo | Obbligatorio |
|---|---|---|---|
| test | Filtra per modalità test (true/false) | boolean | false |
Campi del corpo della richiesta (tutti opzionali):
| Parametro | Descrizione | Tipo |
|---|---|---|
| name | Nome del piano (max 50 caratteri) | string |
| description | Descrizione del piano (max 300 caratteri) | string |
| image | Immagine codificata in Base64 o URL immagine | string |
| trial_period_days | Periodo di prova in giorni | integer |
| is_test | Indica l’ambiente di test o produzione | boolean |
Richiesta:
curl -X PUT 'https://api.4geeks.io/v1/plans/f9b77185-a62e-4da9-a056-3c7b812ca334/' \
-H 'Authorization: Api-Key sk_test_51O62xYzAbcDef123' \
-H 'Content-Type: application/json' \
-d '{
"name": "Updated Premium Plan",
"description": "Updated description with full access to features",
"trial_period_days": 14,
"is_test": false
}'
Risposta (200 OK):
{
"code": 200,
"title": "Piano aggiornato",
"content": "Il piano Updated Premium Plan è stato aggiornato correttamente.",
"type": "success",
"data": "f9b77185-a62e-4da9-a056-3c7b812ca334"
}
Risposta (404 Not Found):
{
"code": 404,
"title": "Piano non trovato",
"content": "Il piano con ID f9b77185-a62e-4da9-a056-3c7b812ca334 non esiste o non hai i permessi per modificarlo.",
"type": "danger"
}
Risposta (200 - Nessuna modifica):
{
"code": 200,
"title": "Nessuna modifica",
"content": "Non sono state rilevate modifiche al piano.",
"type": "info",
"data": "f9b77185-a62e-4da9-a056-3c7b812ca334"
}
Eliminare un piano¶
Endpoint
DELETE /v1/plans/{id}/
Elimina definitivamente un piano e tutti gli abbonamenti associati. Quando un piano viene eliminato, tutti i clienti con abbonamenti attivi vengono informati via email.
Parametri di percorso:
| Parametro | Descrizione | Tipo | Obbligatorio |
|---|---|---|---|
| id | L’identificatore univoco di un piano (chiave) | string | true |
Richiesta:
curl -X DELETE 'https://api.4geeks.io/v1/plans/f9b77185-a62e-4da9-a056-3c7b812ca334/' \
-H 'Authorization: Api-Key sk_test_51O62xYzAbcDef123'
Risposta (200 OK):
{
"code": 200,
"title": "Piano eliminato",
"content": "Il piano f9b77185-a62e-4da9-a056-3c7b812ca334 è stato eliminato con successo.",
"type": "success"
}
Risposta (404 Not Found):
{
"code": 404,
"title": "Il piano non esiste",
"content": "Il piano f9b77185-a62e-4da9-a056-3c7b812ca334 non esiste o è già stato eliminato.",
"type": "danger"
}
Gestione degli errori¶
L’API restituisce codici di stato HTTP standard per indicare il successo o il fallimento di una richiesta. Di seguito sono riportati gli errori comuni specifici per i piani:
400 Bad Request¶
Si verifica quando la richiesta è malformata o contiene dati non validi.
Scenari:
| Scenario | Messaggio di errore | Soluzione |
|---|---|---|
| Intervallo di prezzo non valido | "Il prezzo minimo non può essere superiore al massimo." | Assicurati che price_min ≤ price_max |
| Intervallo abbonati non valido | "Il numero minimo di abbonati non può essere superiore al massimo." | Assicurati che subscribers_min ≤ subscribers_max |
| Piano non trovato | "Il piano richiesto non esiste." | Verifica la chiave del piano o i filtri |
Esempio di risposta di errore:
{
"code": 400,
"title": "Intervallo di prezzo non valido",
"content": "Il prezzo minimo non può essere superiore al massimo.",
"type": "warning"
}
401 Unauthorized¶
Autenticazione fallita. La chiave API non è valida, è mancante o è formattata male.
Esempio:
Soluzione:
- Verifica di aver incluso l’header
Authorization: Api-Key sk_test_... - Assicurati che la tua chiave API sia corretta e attiva
- Testa con Postman utilizzando il metodo di autenticazione Api-Key
404 Not Found¶
Il piano richiesto non esiste.
Esempio:
{
"code": 404,
"title": "Il piano non esiste",
"content": "Il piano richiesto non esiste, per favore verifica.",
"type": "danger"
}
Soluzione:
- Verifica che la chiave del piano esista
- Usa l’endpoint di elenco per trovare la chiave del piano corretta
- Assicurati che il piano appartenga al tuo account sviluppatore
Note importanti¶
Eliminazione del piano
- L’eliminazione di un piano annullerà tutti gli abbonamenti attivi
- I clienti riceveranno una notifica via email dell’eliminazione del piano
- Questa azione non può essere annullata
Test vs Produzione
- Usa la tua Chiave di Test (
sk_test_...) per lo sviluppo e il testing - Usa la tua Chiave Live (
sk_live_...) per le transazioni reali - Il sistema rileva automaticamente la modalità in base alla Chiave API utilizzata
Intervalli
month- Fatturazione mensileyear- Fatturazione annualeinterval_countspecifica quanti intervalli (es. interval=month, interval_count=3 = ogni 3 mesi)
Periodo di prova
- Il periodo di prova è specificato in giorni
- Imposta
trial_period_daysa 0 se non vuoi un periodo di prova - Durante il periodo di prova ai clienti non viene addebitato alcun costo
- Alla scadenza del periodo di prova viene applicato il primo addebito
Filtraggio
- È possibile combinare più filtri
- I filtri sono applicati in logica AND
- I parametri di ricerca utilizzano la corrispondenza case-insensitive
Migliori pratiche¶
- Nomi chiari dei piani - Usa nomi descrittivi che indichino chiaramente il livello e le funzionalità
- Descrizioni accurate - Fornisci descrizioni dettagliate di ciò che è incluso in ogni piano
- Prezzi appropriati - Assicurati che i prezzi siano competitivi e riflettano il valore fornito
- Periodi di prova - Valuta la possibilità di offrire periodi di prova per ridurre l’attrito nell’acquisizione dei clienti
- Testa prima della produzione - Usa la modalità test con le chiavi API di test per la validazione
- Monitora gli abbonati - Usa il conteggio degli abbonati nelle risposte per tracciare l’adozione dei piani
- Versionamento dei piani - Crea nuovi piani invece di modificare pesantemente quelli esistenti con abbonati
- Ottimizzazione immagini - Usa immagini ottimizzate per ridurre i tempi di risposta dell’API
Risoluzione dei problemi¶
Problema: “Il piano non esiste”¶
Causa: La chiave del piano non esiste o appartiene a un diverso account sviluppatore
Soluzione: - Verifica la chiave del piano utilizzando l’endpoint di elenco - Assicurati di utilizzare la chiave API corretta - Controlla che il piano non sia stato eliminato
Problema: “Le credenziali di autenticazione non sono state fornite”¶
Causa: Autenticazione con chiave API mancante o non valida
Soluzione: - Usa l’header Authorization: Api-Key sk_test_... nella tua richiesta - Verifica che la tua chiave API sia attiva - Testa con Postman utilizzando l’autenticazione Api-Key
Problema: “Il prezzo minimo non può essere superiore al massimo”¶
Causa: Filtro dell’intervallo di prezzo fornito non valido
Soluzione: - Assicurati che price_min ≤ price_max - Verifica che i valori del filtro siano numeri validi
Problema: “Il piano richiesto non esiste”¶
Causa: I filtri della query non hanno trovato alcun piano
Soluzione: - Verifica che i parametri del filtro siano corretti - Prova a elencare tutti i piani senza filtri - Controlla se il piano esiste in modalità test (regola il parametro test)
FAQ¶
D: Posso cambiare il prezzo di un piano esistente?
A: No, i prezzi del piano sono immutabili. Crea un nuovo piano con il prezzo aggiornato e migra i clienti verso di esso.
D: Cosa succede quando elimino un piano?
A: Tutti gli abbonamenti attivi vengono annullati e i clienti vengono informati. Questa azione non può essere annullata.
D: Posso avere più piani con lo stesso nome?
A: Sì, ma si consiglia di utilizzare nomi univoci per una gestione e un’identificazione più semplici.
D: Quanti piani posso creare?
A: Non c’è limite al numero di piani che puoi creare.
D: Posso aggiornare l’intervallo o il numero di intervalli dopo la creazione?
A: No, questi sono immutabili. Crea un nuovo piano con la frequenza di fatturazione desiderata.
D: Qual è la differenza tra intervallo e numero di intervalli?
A: interval è l’unità (mese, anno), e interval_count è il moltiplicatore (es. ogni 3 mesi = interval=month, interval_count=3).
D: Posso usare lo stesso piano per più prodotti?
A: Sì, i piani sono indipendenti dai prodotti. Un piano rappresenta una configurazione del ciclo di fatturazione.
D: Come faccio a controllare il numero di abbonati attivi per un piano?
A: Usa gli endpoint di elenco o di recupero. Il campo information.count mostra gli abbonamenti attivi.
- Hai ancora domande? Richiedi supporto..
- Check out the changelog.