# Définir une transaction

> Crée une nouvelle transaction pour un utilisateur final de votre application dans Adapty et fournit un niveau d'accès. La transaction créée par cette méthode apparaîtra dans vos analyses et dans le fil d'événements, et sera envoyée à toutes les intégrations.
>
> **Mise à jour d'un abonnement existant :** Pour mettre à jour `billing_issue_detected_at` ou `renew_status_changed_at` sans générer de nouvel événement `subscription_renewed`, réutilisez le `store_transaction_id` existant (sous le même `store_original_transaction_id`). La soumission d'un nouveau `store_transaction_id` est traitée comme une nouvelle transaction et déclenche un événement `subscription_renewed`.

## OpenAPI

```yaml
/api-specs/adapty-api.yaml post /api/v2/server-side-api/purchase/set/transaction/
openapi: 3.1.0
info:
  title: API côté serveur Adapty
  version: 1.0.0
servers:
  - url: https://api.adapty.io
    description: Serveur de production
paths:
  /api/v2/server-side-api/purchase/set/transaction/:
    post:
      summary: Définir une transaction
      description: |
        Crée une nouvelle transaction pour un utilisateur final de votre application dans Adapty et fournit un niveau d'accès. La transaction créée par cette méthode apparaîtra dans vos analyses et dans le fil d'événements, et sera envoyée à toutes les intégrations.

        **Mise à jour d'un abonnement existant :** Pour mettre à jour `billing_issue_detected_at` ou `renew_status_changed_at` sans générer de nouvel événement `subscription_renewed`, réutilisez le `store_transaction_id` existant (sous le même `store_original_transaction_id`). La soumission d'un nouveau `store_transaction_id` est traitée comme une nouvelle transaction et déclenche un événement `subscription_renewed`.
      operationId: setTransaction
      tags:
        - Purchase
      security:
        - apikeyAuth: []
      parameters:
        - name: adapty-customer-user-id
          in: header
          required: false
          schema:
            type: string
          description: L'identifiant unique du client dans votre système. `adapty-customer-user-id` ou `adapty-profile-id` est requis.
        - name: adapty-profile-id
          in: header
          required: false
          schema:
            type: string
          description: L'identifiant unique du profil dans votre système. Meilleure option si vous travaillez avec des profils anonymes. `adapty-customer-user-id` ou `adapty-profile-id` est requis.
      responses:
        "200":
          description: Transaction enregistrée avec succès
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ProfileResponse"
        "400":
          description: Requête incorrecte
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "401":
          description: Non autorisé
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "404":
          description: Profil introuvable
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
        "500":
          description: Erreur interne du serveur
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TransactionDTORequest"
            examples:
              one_time_purchase:
                summary: Exemple d'achat unique
                value:
                  purchase_type: one_time_purchase
                  store: app_store
                  environment: Production
                  store_product_id: premium_lifetime
                  store_transaction_id: "1000000123456789"
                  store_original_transaction_id: "1000000123456789"
                  is_family_shared: false
                  price:
                    country: US
                    currency: USD
                    value: 9.99
                  purchased_at: "2024-01-15T10:30:00Z"
                  variation_id: variation_123
                  offer: null
                  refunded_at: null
                  cancellation_reason: null
              subscription:
                summary: Exemple d'abonnement
                value:
                  purchase_type: subscription
                  store: app_store
                  environment: Production
                  store_product_id: premium_monthly
                  store_transaction_id: "1000000123456789"
                  store_original_transaction_id: "1000000123456789"
                  is_family_shared: false
                  price:
                    country: US
                    currency: USD
                    value: 4.99
                  purchased_at: "2024-01-15T10:30:00Z"
                  originally_purchased_at: "2024-01-15T10:30:00Z"
                  expires_at: "2024-02-15T10:30:00Z"
                  renew_status: true
                  renew_status_changed_at: null
                  billing_issue_detected_at: null
                  grace_period_expires_at: null
                  variation_id: variation_123
                  offer:
                    category: introductory
                    type: free_trial
                    id: trial_offer_123
                  refunded_at: null
                  cancellation_reason: null
components:
  schemas:
    ProfileResponse:
      type: object
      properties:
        data:
          $ref: "#/components/schemas/Profile"
      required:
        - data
    ErrorResponse:
      type: object
      properties:
        errors:
          type: array
          items:
            type: object
            properties:
              source:
                type: string
                nullable: true
                description: Source de l'erreur
              errors:
                type: array
                items:
                  type: string
                description: Tableau de messages d'erreur
        error_code:
          type: string
          description: Nom court de l'erreur
        status_code:
          type: integer
          description: Code de statut HTTP
      required:
        - errors
        - error_code
        - status_code
    TransactionDTORequest:
      oneOf:
        - $ref: "#/components/schemas/OneTimePurchaseDTO"
        - $ref: "#/components/schemas/SubscriptionDTO"
      discriminator:
        propertyName: purchase_type
    Profile:
      type: object
      properties:
        app_id:
          type: string
          format: uuid
          description: L'identifiant interne de votre application
        profile_id:
          type: string
          format: uuid
          description: Identifiant de profil Adapty
        customer_user_id:
          type: string
          nullable: true
          description: L'identifiant de votre utilisateur dans votre système
        total_revenue_usd:
          type: number
          format: float
          description: Valeur décimale représentant le chiffre d'affaires total en USD généré par le profil
        segment_hash:
          type: string
          description: Paramètre interne
        timestamp:
          type: integer
          format: int64
          description: Temps de réponse en millisecondes, nécessaire pour résoudre une condition de concurrence
        custom_attributes:
          type: array
          items:
            $ref: "#/components/schemas/CustomAttribute"
          description: Maximum de 30 attributs personnalisés autorisés pour le profil
        access_levels:
          type: array
          items:
            $ref: "#/components/schemas/AccessLevel"
          description: Tableau d'objets de niveau d'accès. Tableau vide si le client n'a aucun niveau d'accès
        subscriptions:
          type: array
          items:
            $ref: "#/components/schemas/Subscription"
          description: Tableau d'objets d'abonnement. Tableau vide si le client n'a aucun abonnement
        non_subscriptions:
          type: array
          items:
            $ref: "#/components/schemas/NonSubscription"
          description: Tableau d'objets hors abonnement. Tableau vide si le client n'a aucun achat
      required:
        - app_id
        - profile_id
        - customer_user_id
        - total_revenue_usd
        - segment_hash
        - timestamp
        - custom_attributes
        - access_levels
        - subscriptions
        - non_subscriptions
    OneTimePurchaseDTO:
      type: object
      title: Achat unique
      description: Données de transaction pour un achat unique
      properties:
        purchase_type:
          type: string
          enum:
            - one_time_purchase
          description: Type d'achat
        store:
          type: string
          description: Store où l'achat a été effectué. Les valeurs courantes sont `app_store`, `play_store`, `stripe`, `paddle`, ou tout identifiant de store personnalisé
        environment:
          type: string
          enum:
            - Production
            - Sandbox
          default: Production
          description: Environnement où l'achat a été effectué
        store_product_id:
          type: string
          description: Identifiant du produit dans le store
        store_transaction_id:
          type: string
          maxLength: 50
          description: Identifiant de transaction dans le store. Maximum 50 caractères. Les identifiants de transaction PayPal et de certains stores personnalisés peuvent dépasser cette limite — tronquez ou hachez la valeur avant de la soumettre, sinon la requête échoue.
        store_original_transaction_id:
          type: string
          description: Identifiant de transaction originale dans le store
        is_family_shared:
          type: boolean
          default: false
          description: Si l'achat est partagé en famille
        price:
          $ref: "#/components/schemas/PriceDTO"
        purchased_at:
          type: string
          format: date-time
          description: Quand l'achat a été effectué
        variation_id:
          type: string
          nullable: true
          description: Identifiant de variante pour les tests A/B
        offer:
          $ref: "#/components/schemas/OfferDTO"
          nullable: true
        refunded_at:
          type: string
          format: date-time
          nullable: true
          description: Quand l'achat a été remboursé
        cancellation_reason:
          type: string
          enum:
            - billing_error
            - cancelled_by_developer
            - new_subscription_replace
            - price_increase
            - product_was_not_available
            - refund
            - unknown
            - upgraded
            - voluntarily_cancelled
            - adapty_revoked
          nullable: true
          description: Raison de l'annulation
      required:
        - purchase_type
        - store
        - store_product_id
        - store_transaction_id
        - store_original_transaction_id
        - price
        - purchased_at
    SubscriptionDTO:
      type: object
      title: Abonnement
      description: Données de transaction pour un achat par abonnement
      properties:
        purchase_type:
          type: string
          enum:
            - subscription
          description: Type d'achat
        store:
          type: string
          description: Store où l'achat a été effectué. Les valeurs courantes sont `app_store`, `play_store`, `stripe`, `paddle`, ou tout identifiant de store personnalisé
        environment:
          type: string
          enum:
            - Production
            - Sandbox
          default: Production
          description: Environnement où l'achat a été effectué
        store_product_id:
          type: string
          description: Identifiant du produit dans le store
        store_transaction_id:
          type: string
          maxLength: 50
          description: Identifiant de transaction dans le store. Maximum 50 caractères. Les identifiants de transaction PayPal et de certains stores personnalisés peuvent dépasser cette limite — tronquez ou hachez la valeur avant de la soumettre, sinon la requête échoue.
        store_original_transaction_id:
          type: string
          description: Identifiant de transaction originale dans le store
        is_family_shared:
          type: boolean
          default: false
          description: Si l'achat est partagé en famille
        price:
          $ref: "#/components/schemas/PriceDTO"
        purchased_at:
          type: string
          format: date-time
          description: Quand l'achat a été effectué
        variation_id:
          type: string
          nullable: true
          description: Identifiant de variante pour les tests A/B
        offer:
          $ref: "#/components/schemas/OfferDTO"
          nullable: true
        refunded_at:
          type: string
          format: date-time
          nullable: true
          description: Quand l'achat a été remboursé
        cancellation_reason:
          type: string
          enum:
            - billing_error
            - cancelled_by_developer
            - new_subscription_replace
            - price_increase
            - product_was_not_available
            - refund
            - unknown
            - upgraded
            - voluntarily_cancelled
            - adapty_revoked
          nullable: true
          description: Raison de l'annulation
        originally_purchased_at:
          type: string
          format: date-time
          description: Quand l'abonnement a été acheté initialement
        expires_at:
          type: string
          format: date-time
          description: Quand l'abonnement expire
        renew_status:
          type: boolean
          description: Si l'abonnement sera renouvelé
        renew_status_changed_at:
          type: string
          format: date-time
          nullable: true
          description: Quand le statut de renouvellement a été modifié
        billing_issue_detected_at:
          type: string
          format: date-time
          nullable: true
          description: Quand un problème de facturation a été détecté
        grace_period_expires_at:
          type: string
          format: date-time
          nullable: true
          description: Quand le délai de grâce expire
      required:
        - purchase_type
        - store
        - store_product_id
        - store_transaction_id
        - store_original_transaction_id
        - price
        - purchased_at
        - originally_purchased_at
        - expires_at
        - renew_status
    CustomAttribute:
      type: object
      properties:
        key:
          type: string
          maxLength: 30
          description: La clé doit être une chaîne de caractères d'au plus 30 caractères. Seuls les lettres, chiffres, tirets, points et underscores sont autorisés
        value:
          oneOf:
            - type: string
            - type: number
          description: La valeur de l'attribut doit comporter au plus 50 caractères. Seules les chaînes de caractères et les décimaux sont autorisés comme valeurs
      required:
        - key
        - value
    AccessLevel:
      type: object
      properties:
        access_level_id:
          type: string
          description: Identifiant du niveau d'accès
        store:
          type: string
          description: Store où le niveau d'accès a été acheté
        store_product_id:
          type: string
          description: Identifiant du produit dans le store
        store_base_plan_id:
          type: string
          nullable: true
          description: Identifiant du plan de base dans le store
        store_transaction_id:
          type: string
          description: Identifiant de transaction dans le store
        store_original_transaction_id:
          type: string
          description: Identifiant de transaction originale dans le store
        offer:
          allOf:
            - $ref: "#/components/schemas/OfferDTO"
          nullable: true
          description: Détails de l'offre, si une offre promotionnelle ou de lancement a été appliquée
        starts_at:
          type: string
          format: date-time
          nullable: true
          description: Quand le niveau d'accès commence
        purchased_at:
          type: string
          format: date-time
          description: Quand le niveau d'accès a été acheté
        originally_purchased_at:
          type: string
          format: date-time
          description: Quand le niveau d'accès a été acheté initialement
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: Quand le niveau d'accès expire
        renewal_cancelled_at:
          type: string
          format: date-time
          nullable: true
          description: Quand le renouvellement a été annulé
        billing_issue_detected_at:
          type: string
          format: date-time
          nullable: true
          description: Quand un problème de facturation a été détecté
        is_in_grace_period:
          type: boolean
          description: Si le niveau d'accès est en délai de grâce
        cancellation_reason:
          type: string
          nullable: true
          description: Raison de l'annulation
    Subscription:
      type: object
      properties:
        store:
          type: string
          description: Store où l'abonnement a été acheté
        store_product_id:
          type: string
          description: Identifiant du produit dans le store
        store_base_plan_id:
          type: string
          nullable: true
          description: Identifiant du plan de base dans le store
        store_transaction_id:
          type: string
          description: Identifiant de transaction dans le store
        store_original_transaction_id:
          type: string
          description: Identifiant de transaction originale dans le store
        offer:
          allOf:
            - $ref: "#/components/schemas/OfferDTO"
          nullable: true
          description: Détails de l'offre, si une offre promotionnelle ou de lancement a été appliquée
        environment:
          type: string
          description: Environnement (Sandbox, Production)
        purchased_at:
          type: string
          format: date-time
          description: Quand l'abonnement a été acheté
        originally_purchased_at:
          type: string
          format: date-time
          description: Quand l'abonnement a été acheté initialement
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: Quand l'abonnement expire
        renewal_cancelled_at:
          type: string
          format: date-time
          nullable: true
          description: Quand le renouvellement a été annulé
        billing_issue_detected_at:
          type: string
          format: date-time
          nullable: true
          description: Quand un problème de facturation a été détecté
        is_in_grace_period:
          type: boolean
          description: Si l'abonnement est en délai de grâce
        cancellation_reason:
          type: string
          nullable: true
          description: Raison de l'annulation
    NonSubscription:
      type: object
      properties:
        purchase_id:
          type: string
          format: uuid
          description: Identifiant unique de l'achat
        store:
          type: string
          description: Store où l'achat a été effectué
        store_product_id:
          type: string
          description: Identifiant du produit dans le store
        store_base_plan_id:
          type: string
          nullable: true
          description: Identifiant du plan de base dans le store
        store_transaction_id:
          type: string
          description: Identifiant de transaction dans le store
        store_original_transaction_id:
          type: string
          description: Identifiant de transaction originale dans le store
        purchased_at:
          type: string
          format: date-time
          description: Quand l'achat a été effectué
        environment:
          type: string
          description: Environnement (Sandbox, Production)
        is_refund:
          type: boolean
          description: Si cet achat est un remboursement
        is_consumable:
          type: boolean
          description: Si cet achat est un consommable
    PriceDTO:
      type: object
      properties:
        country:
          type: string
          description: Code pays
        currency:
          type: string
          description: Code devise
        value:
          type: number
          format: float
          description: Valeur du prix
      required:
        - country
        - currency
        - value
    OfferDTO:
      type: object
      properties:
        category:
          type: string
          enum:
            - introductory
            - promotional
            - offer_code
            - win_back
          description: Catégorie de l'offre
        type:
          type: string
          enum:
            - free_trial
            - pay_as_you_go
            - pay_up_front
          description: Type d'offre
        id:
          type: string
          nullable: true
          description: Identifiant de l'offre
      required:
        - category
        - type
  securitySchemes:
    apikeyAuth:
      type: apiKey
      name: Authorization
      in: header
      default: Api-Key {Your secret API key}
      description: |
        Les requêtes API doivent être authentifiées par votre clé API secrète via l'en-tête **Authorization** 
        avec la valeur `Api-Key {your_secret_api_key}`, par exemple, 
        `Api-Key secret_live_...`. Retrouvez cette clé dans l'Adapty Dashboard -> 
        **App Settings** -> onglet **General** -> section **API keys**.
```
