POST /api/v1/profile/transaction-event/save/

Enregistrer un événement de transaction

Enregistre un événement de transaction de store pour un profil. Adapty Mail utilise les événements de transaction pour placer les profils dans des flows basés sur les achats — l'event_type correspond à des flows tels que renouvellement annulé, problème de facturation, expiré et remboursé — ainsi que pour l'attribution des revenus.

Envoyez ces événements lorsque vous gérez des achats, des renouvellements et des annulations. Seul le flow jamais acheté fonctionne sans eux.

Request body

event_typestringrequired

Le type d'événement de transaction. Les flux basés sur les achats sont déclenchés par ces valeurs.

One of: "subscription_started", "subscription_renewed", "subscription_renewal_cancelled", "subscription_renewal_reactivated", "billing_issue_detected", "entered_grace_period", "subscription_refunded", "subscription_expired", "non_subscription_purchase", "non_subscription_purchase_refunded"

event_idstringrequired

Identifiant unique de cet événement, géré par votre système. Utilisez-le pour garantir l'idempotence des événements.

event_datetimestringrequired

Date et heure d'enregistrement de l'événement, au format ISO 8601.

external_profile_idstringrequired

Le même external_profile_id stable que vous envoyez lors de l'enregistrement du profil. Associe la transaction au bon profil. Vous pouvez envoyer une transaction avant que le profil n'existe. Adapty Mail conserve l'événement sans association et le lie au profil lors du prochain enregistrement portant le même identifiant.

customer_user_idstring

L'identifiant de l'utilisateur dans votre propre système. Adapty Mail l'utilise pour retrouver le profil lorsque external_profile_id ne correspond à aucun profil. Il n'est pas stocké sur l'événement.

emailstring

L'adresse e-mail de l'acheteur. Adapty Mail l'utilise pour retrouver le profil lorsqu'aucun identifiant ne correspond. Elle n'est pas stockée sur l'événement.

storestringrequired

Le store dont provient la transaction, par exemple app_store, play_store ou stripe.

store_product_idstringrequired

Identifiant du produit acheté dans le store.

store_transaction_idstringrequired

Identifiant de cette transaction dans le store.

store_original_transaction_idstringrequired

Identifiant de la première transaction dans la chaîne d'abonnement. Pour le premier achat, il est égal à store_transaction_id.

purchased_atstringrequired

Date et heure de cette transaction, au format ISO 8601.

originally_purchased_atstringrequired

Date et heure du premier achat de l'abonnement, au format ISO 8601.

price_usdstring

Le montant de la transaction en USD, sous forme de chaîne décimale (par exemple, "9.99").

expires_atstring

Date et heure d'expiration de l'abonnement, au format ISO 8601. À omettre pour les achats uniques.

offerobject

Détails d'une offre promotionnelle ou d'une offre de lancement appliquée à la transaction.

categorystringrequired

One of: "introductory", "promotional", "offer_code", "win_back"

offer_typestringrequired

One of: "free_trial", "pay_as_you_go", "pay_up_front"

offer_idstring

Identifiant de l'offre dans le store, le cas échéant.

Responses

Événement de transaction enregistré avec succès. Le corps de la réponse est un objet vide.

Schema
object
Example
{}

Échec de la validation — un champ obligatoire est manquant ou invalide. field_name indique le champ concerné.

Schema

Réponse d'erreur standard. Chaque échec renvoie un statut 4XX avec cette structure.

errorsarray of object
messagestring

Description de l'erreur lisible par un humain.

error_codestring

Identifiant d'erreur lisible par une machine.

status_codeinteger

Code de statut HTTP pour cette erreur.

field_namestring

Le champ de la requête à l'origine de l'erreur, ou null si l'erreur n'est pas liée à un champ spécifique.

Example
{
  "errors": [
    {
      "message": "Field required",
      "error_code": "base_error",
      "status_code": 400,
      "field_name": "event_type"
    }
  ]
}

Clé API secrète manquante ou invalide.

Schema

Réponse d'erreur standard. Chaque échec renvoie un statut 4XX avec cette structure.

errorsarray of object
messagestring

Description de l'erreur lisible par un humain.

error_codestring

Identifiant d'erreur lisible par une machine.

status_codeinteger

Code de statut HTTP pour cette erreur.

field_namestring

Le champ de la requête à l'origine de l'erreur, ou null si l'erreur n'est pas liée à un champ spécifique.

Example
{
  "errors": [
    {
      "message": "Secret key doesn't exist",
      "error_code": "secret_key_does_not_exist_error",
      "status_code": 403,
      "field_name": null
    }
  ]
}