API Subscriptions
July 30, 2026
Créez, récupérez, mettez à jour et annulez des abonnements FlowAlp Pay par API, avec intervalles de facturation récurrente, durée et TVA.
Une Subscription est un accord de facturation récurrente géré par FlowAlp Pay : la plateforme débite le moyen de paiement enregistré du client à chaque intervalle de paiement. Les endpoints ci-dessous créent un abonnement pour un contact existant, le consultent, ajustent le montant facturé et annulent l'accord. Si vous préférez que vos clients démarrent l'abonnement via le checkout hébergé, créez un Gateway avec les paramètres subscriptionState, subscriptionInterval, subscriptionPeriod et subscriptionCancellationInterval — le concept est expliqué dans Abonnements et paiements récurrents.
L'API Subscription est utilisée en production, mais une partie de son comportement documenté évolue encore. Si un champ répond différemment de ce qui est décrit ici, considérez la réponse réelle de l'API comme la référence et contactez le support avant de vous y fier.
Créer une Subscription
https://api.pay.flowalp.com/v1.16/Subscription/v1.14 · v1.15 · v1.16Tous les paramètres d'intervalle utilisent des durées ISO 8601 au format du DateInterval de PHP — par exemple P1D (un jour), P1W (une semaine), P1M (un mois) ou P1Y (un an).
Paramètres de la requête
| Paramètre | Type | Description |
|---|---|---|
| instance | string (requis) | Paramètre de requête : nom de votre instance (tenant). |
| userId | string (requis) | ID du contact à facturer. Vous le recevez dans le webhook de transaction du paiement initial. |
| psp | string (requis) | ID numérique du fournisseur de paiement à débiter. Récupérez-le via l'endpoint des fournisseurs de paiement. |
| amount | string (requis) | Montant débité à chaque intervalle, valeur numérique en unités mineures (1490 = CHF 14.90). |
| currency | string (requis) | Code devise ISO du paiement, par exemple CHF. |
| purpose | string (requis) | Ce que le client paie. |
| paymentInterval | string (requis) | Fréquence du débit, p. ex. P1M pour une facturation mensuelle. |
| period | string (requis) | Durée totale de l'abonnement, p. ex. P1Y. |
| cancellationInterval | string (requis) | Délai de résiliation, p. ex. P1M. |
| referenceId | string | Votre référence interne ; elle est renvoyée dans les notifications webhook pour rattacher l'abonnement à vos données. |
| vatRate | string | Taux de TVA en pourcentage. |
curl -X POST "https://api.pay.flowalp.com/v1.16/Subscription/?instance=<tenant>" \
-H "x-api-key: <api-secret>" \
-H "Content-Type: application/json" \
-d '{
"userId": "12",
"psp": "4",
"amount": "1490",
"currency": "CHF",
"purpose": "Streaming plan",
"paymentInterval": "P1M",
"period": "P1Y",
"cancellationInterval": "P1M",
"referenceId": "PLAN-2026-042"
}'<?php
use FlowAlpPay\FlowAlpPay;
use FlowAlpPay\Models\Request\Subscription;
$client = new FlowAlpPay(
getenv('FLOWALP_TENANT'),
getenv('FLOWALP_API_SECRET'),
FlowAlpPay::DEFAULT_COMMUNICATION_HANDLER,
'pay.flowalp.com',
'1.16'
);
$subscription = new Subscription();
$subscription->setUserId(12);
$subscription->setPsp(4);
$subscription->setAmount(1490);
$subscription->setCurrency('CHF');
$subscription->setPurpose('Streaming plan');
$subscription->setPaymentInterval('P1M');
$subscription->setPeriod('P1Y');
$subscription->setCancellationInterval('P1M');
try {
$response = $client->create($subscription);
echo $response->getId();
} catch (Exception $e) {
error_log('Subscription create failed: ' . $e->getMessage());
}Récupérer une Subscription
https://api.pay.flowalp.com/v1.16/Subscription/{id}/v1.14 · v1.15 · v1.16| Paramètre | Type | Description |
|---|---|---|
| id | integer (requis) | Paramètre de chemin : ID de l'abonnement à récupérer. |
| instance | string (requis) | Paramètre de requête : nom de votre instance (tenant). |
curl "https://api.pay.flowalp.com/v1.16/Subscription/84/?instance=<tenant>" \
-H "x-api-key: <api-secret>"Lister les Subscriptions
https://api.pay.flowalp.com/v1.16/Subscription/v1.14 · v1.15 · v1.16| Paramètre | Type | Description |
|---|---|---|
| instance | string (requis) | Paramètre de requête : nom de votre instance (tenant). |
| orderByStartDate | string | ASC (défaut) ou DESC — tri selon la date de début de l'abonnement. |
| limit | integer | Nombre maximal de lignes renvoyées. Défaut 10. |
| offset | integer | Nombre de lignes à ignorer. Défaut 0. |
<?php
use FlowAlpPay\Models\Request\Subscription;
// $client : même constructeur que dans l'exemple de création ci-dessus
$request = new Subscription();
$request->setOrderByStartDate('DESC');
$request->setLimit(10);
try {
$subscriptions = $client->getAll($request);
foreach ($subscriptions as $subscription) {
echo $subscription->getId() . ': ' . $subscription->getStatus() . PHP_EOL;
}
} catch (Exception $e) {
error_log('Subscription list failed: ' . $e->getMessage());
}Mettre à jour une Subscription
Les modifications s'appliquent à partir du prochain cycle de facturation. L'ajustement du vatRate des abonnements adossés à des produits est pris en charge depuis la version d'API 1.13.
https://api.pay.flowalp.com/v1.16/Subscription/{id}/v1.14 · v1.15 · v1.16| Paramètre | Type | Description |
|---|---|---|
| id | integer (requis) | Paramètre de chemin : ID de l'abonnement à mettre à jour. |
| instance | string (requis) | Paramètre de requête : nom de votre instance (tenant). |
| amount | string | Nouveau montant en unités mineures, débité à partir du prochain intervalle de paiement. |
| currency | string | Code devise ISO du paiement. |
| purpose | string | Nouveau motif de paiement. |
| vatRate | string | Nouveau taux de TVA en pourcentage. |
curl -X PUT "https://api.pay.flowalp.com/v1.16/Subscription/84/?instance=<tenant>" \
-H "x-api-key: <api-secret>" \
-H "Content-Type: application/json" \
-d '{
"amount": "1990",
"currency": "CHF",
"purpose": "Streaming plan Plus"
}'<?php
use FlowAlpPay\Models\Request\Subscription;
// $client : même constructeur que dans l'exemple de création ci-dessus
$subscription = new Subscription();
$subscription->setId(84);
$subscription->setAmount(1990);
$subscription->setCurrency('CHF');
$subscription->setPurpose('Streaming plan Plus');
try {
$client->update($subscription);
} catch (Exception $e) {
error_log('Subscription update failed: ' . $e->getMessage());
}Annuler une Subscription
L'annulation met fin à la facturation récurrente de l'abonnement. L'opération est exposée par le SDK officiel, où la résiliation est envoyée comme requête DELETE sur la ressource subscription.
https://api.pay.flowalp.com/v1.16/Subscription/{id}/v1.14 · v1.15 · v1.16curl -X DELETE "https://api.pay.flowalp.com/v1.16/Subscription/84/?instance=<tenant>" \
-H "x-api-key: <api-secret>"<?php
use FlowAlpPay\Models\Request\Subscription;
// $client : même constructeur que dans l'exemple de création ci-dessus
$subscription = new Subscription();
$subscription->setId(84);
try {
$client->cancel($subscription);
} catch (Exception $e) {
error_log('Subscription cancel failed: ' . $e->getMessage());
}Réponse
Les endpoints Subscription répondent avec l'enveloppe habituelle : status plus un tableau data d'objets subscription. paymentInterval reflète le rythme de facturation, valid_until indique jusqu'à quand la période en cours est payée, et les objets imbriqués invoice et contact décrivent ce qui est facturé et à qui.
{
"status": "success",
"data": [
{
"id": 84,
"uuid": "a5e0c919",
"status": "active",
"start": "2026-01-12",
"end": null,
"valid_until": "2027-01-12",
"paymentInterval": "P1M",
"invoice": {
"number": "Streaming plan",
"currency": "CHF",
"referenceId": "PLAN-2026-042",
"originalAmount": 1490,
"refundedAmount": 0
},
"contact": {
"id": 12,
"uuid": "4ab402a9",
"firstname": "Anna",
"lastname": "Keller",
"email": "anna.keller@example.com",
"countryISO": "CH"
}
}
]
}Erreurs
| Statut HTTP | Signification |
|---|---|
| 400 | Requête mal formée — le champ message du corps d'erreur décrit le problème exact. |
| 404 | Aucun abonnement avec l'ID indiqué n'existe sur cette instance. |
Les débits récurrents apparaissent comme des transactions normales : suivez-les avec Lister et récupérer les Transactions ou via les événements webhook. Pour connaître les ID de fournisseurs acceptés par psp, appelez l'endpoint des fournisseurs de paiement.