Aller au contenu principal

Menu de commandes

Accédez à une page ou recherchez dans le catalogue

API

Documentation de l'API

Référence complète de l'API développeur Getly v1

Authentification

Toutes les requêtes à l'API doivent inclure votre clé d'API dans l'en-tête Authorization, avec le schéma de jeton Bearer.

HTTP header
Authorization: Bearer gk_your_api_key_here

Portées disponibles

Les clés d'API sont liées à une boutique précise et disposent d'autorisations détaillées. Créez des clés sur /dashboard/developer/keys.

read:productswrite:productsread:ordersread:storewrite:storeread:analyticswebhooks:manageread:postswrite:postsread:couponswrite:couponsread:licenseswrite:licensescheckout:createread:billingwrite:billing

Limites de débit

Les requêtes à l'API sont limitées à 100 requests per minute par clé d'API. Si vous dépassez la limite, vous recevrez une réponse 429 : patientez un instant et réessayez.

Prévoyez vos intégrations pour rester dans ces limites. Regroupez les opérations quand c'est possible et mettez les réponses en cache de votre côté.

Gestion des erreurs

Toutes les réponses de l'API suivent un format cohérent. Les erreurs incluent un message descriptif.

application/json
// Success
{ "success": true, "data": { ... } }

// Error
{
  "success": false,
  "error": "Description of what went wrong",
  "errorDetail": {
    "code": "validation_failed",   // stable, safe to branch on
    "message": "price must be a positive integer in cents",
    "hint": "Fix the field named in `param` and retry the same request.",
    "param": "price",              // omitted when no single field is at fault
    "docsUrl": "https://www.getly.store/developers/docs#errors"
  }
}

Codes de statut HTTP

200 - Succès

201 - Créé

400 - Requête incorrecte (données invalides)

401 - Non autorisé (clé d'API absente ou invalide)

403 - Interdit (portée manquante ou ressource qui n'est pas la vôtre)

404 - Introuvable

500 - Erreur interne du serveur

Endpoints

URL de base : https://www.getly.store. Tous les prix sont en centimes (ex. : 1999 = 19,99 $).

GET/api/v1/productsread:products

Lister les produits de votre boutique

bash
curl -X GET "https://www.getly.store/api/v1/products?page=1&limit=20" \
  -H "Authorization: Bearer gk_your_api_key"
Réponse · application/json
{
  "success": true,
  "data": [
    {
      "id": "uuid",
      "name": "Premium Icon Pack",
      "slug": "premium-icon-pack-abc123",
      "price": 1999,
      "status": "active",
      "category": { "id": "uuid", "name": "Design", "slug": "design" },
      "images": [{ "url": "...", "altText": "..." }]
    }
  ],
  "total": 42,
  "page": 1,
  "limit": 20,
  "hasMore": true
}
POST/api/v1/productswrite:products

Créer un nouveau produit dans votre boutique

bash
curl -X POST "https://www.getly.store/api/v1/products" \
  -H "Authorization: Bearer gk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My New Product",
    "description": "A great digital product",
    "price": 29.99,
    "categoryId": "uuid",
    "status": "active",
    "tags": ["design", "icons"],
    "images": [{ "url": "https://cdn.getly.store/...png", "altText": "cover" }],
    "files": [{ "fileUrl": "https://cdn.getly.store/files/.../abc.zip", "fileName": "pack.zip", "fileSize": 10485760, "fileType": "application/zip" }]
  }'
Réponse · application/json
{
  "success": true,
  "data": {
    "id": "uuid",
    "name": "My New Product",
    "slug": "my-new-product-abc123",
    "price": 2999,
    "status": "active",
    "createdAt": "2025-01-15T10:30:00Z"
  }
}
GET/api/v1/products/:idread:products

Obtenir les détails d'un produit par ID

bash
curl -X GET "https://www.getly.store/api/v1/products/{id}" \
  -H "Authorization: Bearer gk_your_api_key"
Réponse · application/json
{
  "success": true,
  "data": {
    "id": "uuid",
    "name": "Premium Icon Pack",
    "price": 1999,
    "images": [...],
    "files": [...],
    "reviews": [...]
  }
}
PATCH/api/v1/products/:idwrite:products

Mettre à jour un produit existant

bash
curl -X PATCH "https://www.getly.store/api/v1/products/{id}" \
  -H "Authorization: Bearer gk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Updated Name", "price": 39.99 }'
Réponse · application/json
{
  "success": true,
  "data": { "id": "uuid", "name": "Updated Name", "price": 3999 }
}
DELETE/api/v1/products/:idwrite:products

Archivez (suppression logique) un produit. Il n'est plus listé publiquement ; les commandes et téléchargements existants continuent de fonctionner.

bash
curl -X DELETE "https://www.getly.store/api/v1/products/{id}" \
  -H "Authorization: Bearer gk_your_api_key"
Réponse · application/json
{
  "success": true,
  "data": { "id": "uuid", "status": "archived" },
  "message": "Product archived"
}
POST/api/v1/products/:id/fileswrite:products

Joignez un fichier téléchargeable à un produit. Utilisez multipart pour les petits fichiers, ou la sous-route presign + un PUT direct vers R2 pour les fichiers jusqu'à 2 Go. Vous pouvez aussi passer un tableau files[] à POST /api/v1/products pour les joindre dès la création.

bash
# Direct upload (multipart) - best for files under ~4MB:
curl -X POST "https://www.getly.store/api/v1/products/{id}/files" \
  -H "Authorization: Bearer gk_your_api_key" \
  -F "file=@/path/to/your-file.zip"

# Large files (up to 2GB) - 3 steps:
# 1) get a presigned upload URL
curl -X POST "https://www.getly.store/api/v1/products/{id}/files/presign" \
  -H "Authorization: Bearer gk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "fileName": "pack.zip", "fileSize": 524288000, "fileType": "application/zip" }'
# 2) PUT the bytes straight to R2 (use the returned uploadUrl)
curl -X PUT "<uploadUrl>" --data-binary "@/path/to/pack.zip" \
  -H "Content-Length: 524288000"
# 3) attach the uploaded object (use the returned fileUrl)
curl -X POST "https://www.getly.store/api/v1/products/{id}/files" \
  -H "Authorization: Bearer gk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "fileUrl": "<fileUrl>", "fileName": "pack.zip", "fileSize": 524288000, "fileType": "application/zip" }'
Réponse · application/json
{
  "success": true,
  "data": {
    "id": "uuid",
    "fileName": "pack.zip",
    "fileUrl": "https://cdn.getly.store/files/.../abc.zip",
    "fileSize": 524288000,
    "fileType": "application/zip",
    "version": "1.0",
    "isLatest": true,
    "createdAt": "2026-06-02T10:30:00Z"
  }
}
POST/api/v1/uploads/images/presignwrite:products

Obtenez une URL présignée pour téléverser l'image d'un produit (max. 10 Mo ; png, jpeg, webp, gif, avif). Obligatoire avant qu'un produit puisse être mis en ligne.

bash
# Images are uploaded in 3 steps - there is no direct multipart route.
# 1) ask for a presigned URL (max 10MB; png, jpeg, webp, gif or avif)
curl -X POST "https://www.getly.store/api/v1/uploads/images/presign" \
  -H "Authorization: Bearer gk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "fileName": "cover.png", "fileSize": 184320, "contentType": "image/png" }'

# 2) PUT the raw bytes to the returned uploadUrl (expires in 1h) with the
#    returned uploadHeaders. Content-Length MUST equal the fileSize you declared.
#    Send Content-Type equal to the declared type (curl --data-binary alone sends
#    a form type; Getly corrects it when the image is attached, but send it anyway).
curl -X PUT "<uploadUrl>" --data-binary "@/path/to/cover.png" \
  -H "Content-Type: image/png" -H "Content-Length: 184320"

# 3) reference the returned publicUrl when you create or update the product.
#    An image is REQUIRED before a product can go live.
curl -X PATCH "https://www.getly.store/api/v1/products/{id}" \
  -H "Authorization: Bearer gk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "images": ["<publicUrl>"] }'
Réponse · application/json
{
  "success": true,
  "data": {
    "uploadUrl": "https://<bucket>.r2.cloudflarestorage.com/...",
    "uploadHeaders": { "Content-Type": "image/png" },
    "publicUrl": "https://cdn.getly.store/images/.../abc.png",
    "expiresIn": 3600
  }
}
GET/api/v1/products/:id/keysread:products

Listez le pool de clés de licence d'un produit : compteurs (disponibles/émises/en attente) et une liste paginée et masquée. La clé en clair n'est jamais renvoyée.

bash
curl -X GET "https://www.getly.store/api/v1/products/{id}/keys?limit=50&offset=0" \
  -H "Authorization: Bearer gk_your_api_key"
Réponse · application/json
{
  "success": true,
  "data": {
    "keyPoolEnabled": true,
    "keyPoolLowThreshold": 5,
    "counts": { "available": 12, "issued": 40, "waiting": 0 },
    "keys": [
      { "id": "uuid", "masked": "ABCD…WXYZ", "status": "available", "issuedAt": null, "orderItemId": null, "refunded": false }
    ],
    "limit": 50,
    "offset": 0,
    "total": 52
  }
}
POST/api/v1/products/:id/keyswrite:products

Collez vos propres clés, bons ou URL uniques dans le pool d'un produit, une par élément du tableau. Les doublons et les entrées vides sont signalés, pas ignorés en silence ; les acheteurs qui attendaient reçoivent une clé aussitôt.

bash
curl -X POST "https://www.getly.store/api/v1/products/{id}/keys" \
  -H "Authorization: Bearer gk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "keys": ["ABCD-1234-EFGH-5678", "IJKL-9012-MNOP-3456"] }'
Réponse · application/json
{
  "success": true,
  "data": {
    "added": 2,
    "duplicates": 0,
    "duplicatesInInput": 0,
    "tooLong": 0,
    "blank": 0,
    "filled": 1
  }
}
DELETE/api/v1/products/:id/keys/:keyIdwrite:products

Retirez une clé non vendue du pool. Une clé émise est une trace de vente et ne peut pas être retirée : 409 key_not_available.

bash
curl -X DELETE "https://www.getly.store/api/v1/products/{id}/keys/{keyId}" \
  -H "Authorization: Bearer gk_your_api_key"
Réponse · application/json
{
  "success": true,
  "data": { "id": "uuid", "removed": true }
}
GET/api/v1/ordersread:orders

Lister les commandes contenant des articles de votre boutique

bash
curl -X GET "https://www.getly.store/api/v1/orders?page=1&limit=20" \
  -H "Authorization: Bearer gk_your_api_key"
Réponse · application/json
{
  "success": true,
  "data": [
    {
      "id": "uuid",
      "orderId": "uuid",
      "price": 2999,
      "order": { "status": "completed", "buyer": { "name": "John" } },
      "product": { "name": "Premium Pack" }
    }
  ],
  "total": 156,
  "page": 1
}
GET/api/v1/orders/:idread:orders

Obtenir les détails d'une commande (uniquement les articles de votre boutique)

bash
curl -X GET "https://www.getly.store/api/v1/orders/{id}" \
  -H "Authorization: Bearer gk_your_api_key"
Réponse · application/json
{
  "success": true,
  "data": {
    "id": "uuid",
    "status": "completed",
    "total": 5999,
    "buyer": { "name": "John", "email": "[email protected]" },
    "items": [...]
  }
}
GET/api/v1/storeread:store

Obtenir les informations de votre boutique

bash
curl -X GET "https://www.getly.store/api/v1/store" \
  -H "Authorization: Bearer gk_your_api_key"
Réponse · application/json
{
  "success": true,
  "data": {
    "id": "uuid",
    "name": "My Store",
    "slug": "my-store",
    "description": "...",
    "totalSales": 250,
    "totalRevenue": 450000,
    "badges": [...]
  }
}
PATCH/api/v1/storewrite:store

Mettre à jour le nom de la boutique, la description, le site web et socialLinks

bash
curl -X PATCH "https://www.getly.store/api/v1/store" \
  -H "Authorization: Bearer gk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "description": "Updated store description" }'
Réponse · application/json
{
  "success": true,
  "data": { "id": "uuid", "name": "My Store", "description": "Updated store description" }
}
GET/api/v1/analyticsread:analytics

Obtenez les statistiques de ventes de votre boutique

bash
curl -X GET "https://www.getly.store/api/v1/analytics" \
  -H "Authorization: Bearer gk_your_api_key"
Réponse · application/json
{
  "success": true,
  "data": {
    "totalSales": 250,
    "totalRevenue": 450000,
    "monthlySales": 42,
    "monthlyRevenue": 75000,
    "averageOrderValue": 1800,
    "productCount": 15,
    "totalDownloads": 1200,
    "salesByMonth": [
      { "month": "2025-01", "sales": 38, "revenue": 68000 }
    ]
  }
}
GET/api/v1/webhook-endpointswebhooks:manage

Listez les endpoints de webhook de votre boutique

bash
curl -X GET "https://www.getly.store/api/v1/webhook-endpoints" \
  -H "Authorization: Bearer gk_your_api_key"
Réponse · application/json
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "uuid",
        "url": "https://example.com/webhooks",
        "events": ["sale.completed"],
        "isActive": true
      }
    ],
    "nextCursor": null
  }
}
POST/api/v1/webhook-endpointswebhooks:manage

Enregistrez un nouvel endpoint de webhook

bash
curl -X POST "https://www.getly.store/api/v1/webhook-endpoints" \
  -H "Authorization: Bearer gk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/webhooks",
    "events": ["sale.completed", "product.updated"]
  }'
Réponse · application/json
{
  "success": true,
  "data": {
    "id": "uuid",
    "url": "https://example.com/webhooks",
    "events": ["sale.completed", "product.updated"],
    "secret": "abcdef1234567890..."
  }
}
POST/api/v1/postswrite:posts

Créez un article de blog de créateur à partir de Markdown. Mettez crosspostMuhamor à true pour l'afficher aussi dans la communauté Getly Creators sur Muhamor : la copie renvoie vers votre article comme original, et un article réservé aux abonnés n'y apparaît que sous forme d'aperçu.

bash
curl -X POST "https://www.getly.store/api/v1/posts" \
  -H "Authorization: Bearer gk_your_api_key" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 7b1f0c2e-post-1" \
  -d '{
    "title": "How I made my icon pack",
    "contentMarkdown": "## The idea\n\nIt started with...",
    "status": "published",
    "crosspostMuhamor": true
  }'
Réponse · application/json
{
  "success": true,
  "data": {
    "id": "uuid",
    "title": "How I made my icon pack",
    "slug": "how-i-made-my-icon-pack",
    "status": "published",
    "crosspostMuhamor": true
  }
}
GET/api/v1/public/products/{slug}public

Public, sans clé d'API : la fiche d'un produit actif à partir de son slug (nom, prix en centimes avec toute promotion en cours, image de couverture, boutique). 404 pour tout ce qui n'est pas en vente. 60 requêtes par minute par IP.

bash
curl "https://www.getly.store/api/v1/public/products/premium-icon-pack-abc123"
Réponse · application/json
{
  "success": true,
  "data": {
    "slug": "premium-icon-pack-abc123",
    "name": "Premium Icon Pack",
    "shortDescription": "120 line icons",
    "priceCents": 1999,
    "currency": "USD",
    "avgRating": 4.8,
    "reviewCount": 12,
    "imageUrl": "https://cdn.getly.store/images/.../cover.webp",
    "store": { "name": "Pixel Studio", "slug": "pixel-studio" },
    "urls": { "product": "https://www.getly.store/product/premium-icon-pack-abc123" }
  }
}
POST/api/v1/billing/planswrite:billing

Créez un plan récurrent pour votre PROPRE produit (Getly Billing). amount en centimes entiers (min. 50), intervalUnit day/week/month/year, intervalCount 1–52. Nécessite une demande Billing approuvée : 403 billing_not_approved d'ici là. GET liste les plans ; GET/PATCH /{id} en lit et en modifie un.

bash
curl -X POST "https://www.getly.store/api/v1/billing/plans" \
  -H "Authorization: Bearer gk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Pro", "amount": 1900, "intervalUnit": "month", "externalId": "pro-monthly" }'
Réponse · application/json
{
  "success": true,
  "data": {
    "id": "uuid",
    "name": "Pro",
    "amount": 1900,
    "currency": "usd",
    "interval": { "unit": "month", "count": 1 },
    "externalId": "pro-monthly",
    "isActive": true
  }
}
POST/api/v1/billing/checkoutwrite:billing

Générez une page d'abonnement hébergée pour un client, valable 24 heures. customerRef est votre propre identifiant du client et revient dans chaque webhook billing.* sous le nom externalCustomerRef. Le client paie par carte (renouvellement automatique) ou en crypto (une période à la fois).

bash
curl -X POST "https://www.getly.store/api/v1/billing/checkout" \
  -H "Authorization: Bearer gk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "planId": "uuid", "customerRef": "user_8841",
        "successUrl": "https://your-app.com/welcome",
        "cancelUrl": "https://your-app.com/pricing" }'
Réponse · application/json
{
  "success": true,
  "data": {
    "url": "https://www.getly.store/billing/subscribe/uuid?t=…",
    "expiresAt": "2026-09-09T09:00:00.000Z"
  }
}
GET/api/v1/billing/subscriptions/{id}read:billing

La vérification d'état que fait votre backend avant d'accorder l'accès. status : active, past_due (le renouvellement par carte a échoué, le processeur réessaie), canceled, expired (la période payée en crypto est épuisée). Considérez active et past_due comme ayant droit à l'accès jusqu'à currentPeriodEnd. L'endpoint de liste filtre par status, customerRef et planId.

bash
curl "https://www.getly.store/api/v1/billing/subscriptions/uuid" \
  -H "Authorization: Bearer gk_your_api_key"
Réponse · application/json
{
  "success": true,
  "data": {
    "id": "uuid",
    "customerRef": "user_8841",
    "status": "active",
    "paymentMethod": "stripe",
    "currentPeriodEnd": "2026-10-08T09:14:00.000Z",
    "cancelAtPeriodEnd": false,
    "plan": { "name": "Pro", "amount": 1900, "interval": { "unit": "month", "count": 1 } }
  }
}
POST/api/v1/billing/subscriptions/{id}/cancelwrite:billing

Arrête le renouvellement à la fin de la période payée, jamais une coupure immédiate. Vous recevez billing.subscription.canceled à la fin (carte) ou billing.subscription.expired (crypto). 409 subscription_not_cancellable si déjà terminé.

bash
curl -X POST "https://www.getly.store/api/v1/billing/subscriptions/uuid/cancel" \
  -H "Authorization: Bearer gk_your_api_key"
Réponse · application/json
{
  "success": true,
  "data": { "id": "uuid", "status": "active", "cancelAtPeriodEnd": true, "currentPeriodEnd": "2026-10-08T09:14:00.000Z" }
}

Getly Billing

Des plans récurrents pour un produit que vous exploitez vous-même : un SaaS, une communauté, un outil. Les plans vivent dans l'API, la page d'abonnement vit sur getly.store, et votre backend accorde l'accès à partir de cinq webhooks qui portent tous votre propre référence client.

L'accès se fait sur demande : indiquez-nous votre site web et ce que vous vendez sur /dashboard/billing. Jusqu'à l'approbation, les appels d'écriture répondent 403 billing_not_approved et les appels de lecture fonctionnent.

  • billing.subscription.created
  • billing.subscription.renewed
  • billing.payment_failed
  • billing.subscription.canceled
  • billing.subscription.expired
Comment fonctionne Getly Billing

Livrez vos propres clés de licence

Un produit peut distribuer les clés que vous avez déjà générées (clés d'enregistrement, codes de bon ou URL uniques) au lieu d'une clé générée par Getly. Getly remet la clé suivante à chaque vente, première collée, première vendue, et ne bloque jamais une vente à cause d'un pool vide : l'acheteur est prévenu par e-mail que sa clé arrive, et la reçoit dès que d'autres sont ajoutées.

  • Tableau de bord : modification du produit → étape Prix → « Livrer mes propres clés de licence » (le pool a besoin de l'identifiant du produit, il n'est donc pas proposé à la création). Une clé par ligne, jusqu'à 5,000 par ajout ; incompatible avec les clés générées par Getly sur le même produit.
  • API : GET/POST /api/v1/products/{id}/keys liste et ajoute des clés ; DELETE /api/v1/products/{id}/keys/{keyId} en retire une non vendue. keyPoolEnabled et keyPoolLowThreshold sont des champs du produit lui-même, définis via POST/PATCH /api/v1/products.

Vous préférez passer par votre propre backend ? Chaque élément de sale.completed porte désormais licenseKey (la clé déjà émise pour cet élément, issue du pool ou générée par Getly, ou null tant qu'elle est en attente) en plus de buyerEmail, pour que vous puissiez la transmettre ou envoyer la vôtre.

Webhooks

Les webhooks permettent à votre application de recevoir des notifications en temps réel quand des événements se produisent dans votre boutique. Enregistrez des endpoints sur /dashboard/developer/webhooks ou via l'API.

Types d'événements

sale.completed - Une vente a été finalisée pour l'un de vos produits. Inclut l'e-mail de l'acheteur, pour que vous puissiez envoyer votre propre clé de licence.

product.created - Un produit a été créé dans votre boutique

product.updated - Un produit de votre boutique a été mis à jour

review.created - Un nouvel avis a été laissé sur l'un de vos produits

download.completed - Un acheteur a téléchargé l'un de vos produits

refund.created - Un acheteur a demandé un remboursement (la décision arrive ensuite sous la forme order.refunded)

order.refunded - Un remboursement a été enregistré sur l'une de vos commandes

dispute.created - Un acheteur a ouvert un litige

dispute.resolved - Un litige a été résolu

checkout_link.completed - Un lien de paiement a été payé

license.activated - Une clé de licence a été activée

access.expiring - Un achat à accès limité expire dans 7 jours

access.expired - Un achat à accès limité a expiré

billing.subscription.created - Getly Billing : un client s'est abonné à l'un de vos plans

billing.subscription.renewed - Getly Billing : un abonnement a été renouvelé et payé

billing.payment_failed - Getly Billing : le paiement d'un renouvellement a échoué

billing.subscription.canceled - Getly Billing : un abonnement a été annulé

billing.subscription.expired - Getly Billing : un abonnement payé en crypto a expiré sans paiement

* - S'abonner à tous les événements

Format du payload

Chaque envoi de webhook transmet une requête POST JSON avec la structure suivante :

POST · application/json
POST https://your-endpoint.com/webhooks
Content-Type: application/json
X-Getly-Signature: sha256=<hmac_hex>
X-Getly-Event: sale.completed

{
  "deliveryId": "uuid",
  "event": "sale.completed",
  "data": {
    "orderId": "uuid",
    "buyerId": "uuid",
    "buyerEmail": "[email protected]",
    "items": [
      {
        "orderItemId": "uuid",
        "productId": "uuid",
        "price": 2999,
        "sellerAmount": 2399,
        "isGift": false,
        "licenseKey": null
      }
    ],
    "total": 2999
  },
  "timestamp": "2026-09-23T10:30:00.000Z"
}

Vérification de la signature

Chaque envoi de webhook inclut un en-tête X-Getly-Signature. Vérifiez la signature avec HMAC-SHA256 et le secret de votre webhook pour vous assurer que la requête vient de Getly.

node.js
const crypto = require('crypto');

function verifyWebhook(body, signature, secret) {
  const expected = 'sha256=' +
    crypto
      .createHmac('sha256', secret)
      .update(body)
      .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

// In your webhook handler
app.post('/webhooks', (req, res) => {
  const signature = req.headers['x-getly-signature'];
  const isValid = verifyWebhook(
    JSON.stringify(req.body),
    signature,
    process.env.GETLY_WEBHOOK_SECRET
  );

  if (!isValid) {
    return res.status(401).send('Invalid signature');
  }

  const { event, data } = req.body;
  // Handle the event...

  res.status(200).send('OK');
});

Politique de nouvelles tentatives

Les envois échoués (réponse non 2xx ou délai dépassé) sont retentés automatiquement avec un délai croissant :

Tentative 1 : Nouvelle tentative après 1 minute

Tentative 2 : Nouvelle tentative après 5 minutes

Tentative 3 : Nouvelle tentative après 30 minutes

Tentative 4 : Nouvelle tentative après 2 heures

Tentative 5 : Abandon (l'envoi est marqué comme échoué)

Votre endpoint doit répondre en moins de 10 secondes. Renvoyez un code 2xx pour confirmer la réception.