> ## Documentation Index
> Fetch the complete documentation index at: https://docs.i-pay.money/llms.txt
> Use this file to discover all available pages before exploring further.

# Créer un lien de paiement hébergé

> Créez une page de paiement hébergée par iMoney Encaissement et partagez son URL à votre client.

Un lien de paiement délègue l'interface de paiement à iMoney Encaissement : vous redirigez votre client vers une page de paiement hébergée, où il choisit son [moyen de paiement](/guides/reversement#frais-par-moyen-de-paiement) et valide. C'est l'équivalent API du lien créé depuis le tableau de bord. La réponse renvoie `page_url`, la page à transmettre au payeur (redirection, email, SMS, réseau social).

<Warning>
  Ne considérez jamais la redirection du client comme une confirmation de paiement : vérifiez l'état du lien côté serveur, avec [Consulter un lien de paiement](/api-reference/liens-de-paiement/consulter-un-lien) ou un [webhook](/guides/webhooks), avant de livrer une commande.
</Warning>

* **Authentification.** Les clés et le choix Sandbox ou Live suivent les mêmes règles que le reste de l'API : voir [Authentification](/api-reference/authentification).
* **`reference`.** Si vous la fournissez plutôt que de laisser l'API la générer, elle devient l'identifiant utilisé pour consulter l'état du lien via [Consulter un lien de paiement](/api-reference/liens-de-paiement/consulter-un-lien), une opération non authentifiée. Générez une valeur aléatoire à forte entropie, jamais un identifiant de commande séquentiel ou prévisible. Laisser l'API la générer évite ce risque.
* **Redirections.** Les deux URL de redirection doivent être en HTTPS : une URL en HTTP est rejetée.
* **Expiration.** Un lien créé par l'API expire toujours, trente minutes après sa création, quelle que soit la valeur envoyée dans `shouldExpire`. Transmettez le lien à votre client tout de suite, et recréez-en un plutôt que de rediffuser un lien ancien.
* **Doublons.** Une seconde création avec la même `reference` fournie manuellement échoue en validation (`422`) : la référence doit rester unique sur votre compte. Il n'existe pas de clé d'idempotence ; aucune garantie n'est documentée en cas d'appels concurrents (à confirmer auprès du support). Un compte introuvable ou inactif pour l'environnement ciblé renvoie `404`.

Messages d'erreur communs : [Erreurs](/api-reference/erreurs).


## OpenAPI

````yaml openapi.yaml POST /external_payments
openapi: 3.1.0
info:
  title: iPayMoney Merchant API
  version: 1.0.0
  description: >-
    Contrats marchands v1 vérifiés contre les routes, contrôleurs et services
    Rails. Les contrats partenaires et les routes v2 non opérationnelles ne font
    pas partie de cette spécification publique. Les liens de paiement doivent
    utiliser des références aléatoires privées.
servers:
  - url: https://i-pay.money/api/v1
    description: Sandbox ou Live selon les en-têtes et la clé utilisée
security: []
tags:
  - name: Payments
    description: Création et suivi des transactions marchandes
  - name: Payment links
    description: Liens de paiement hébergés
paths:
  /external_payments:
    post:
      tags:
        - Payment links
      summary: Créer un lien de paiement hébergé
      parameters:
        - $ref: '#/components/parameters/TargetEnvironment'
        - name: Ipay-Payment-Type
          in: header
          required: true
          schema:
            type: string
            const: external_payment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExternalPaymentRequest'
            examples:
              lienCommande:
                summary: Lien de paiement d'une commande
                value:
                  title: 'Commande #1001'
                  description: 'Transaction de la commande #1001'
                  amount: 15000
                  on_success_redirection_url: https://votre-site.com/commandes/1001/succes
                  on_failed_redirection_url: https://votre-site.com/commandes/1001/echec
      responses:
        '200':
          description: Lien créé
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExternalPaymentCreateResponse'
        '404':
          description: Compte introuvable ou inactif
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: Paramètres invalides
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
      security:
        - bearerAuth: []
components:
  parameters:
    TargetEnvironment:
      name: Ipay-Target-Environment
      in: header
      required: true
      schema:
        type: string
        enum:
          - sandbox
          - live
  schemas:
    ExternalPaymentRequest:
      type: object
      required:
        - title
      properties:
        title:
          type: string
        description:
          type: string
        amount:
          type:
            - integer
            - 'null'
          minimum: 50
        reference:
          type: string
          minLength: 32
          description: >-
            Omettre pour génération automatique, ou fournir une valeur aléatoire
            privée d'au moins 128 bits.
        shouldExpire:
          type: boolean
          const: true
          default: true
          description: La v1 actuelle crée toujours un lien expirant.
        on_success_redirection_url:
          type: string
          format: uri
          pattern: ^https://
        on_failed_redirection_url:
          type: string
          format: uri
          pattern: ^https://
    ExternalPaymentCreateResponse:
      type: object
      properties:
        title:
          type: string
        amount:
          type:
            - integer
            - 'null'
        reference:
          type: string
        status:
          type: string
          example: initiated
        should_expire:
          type: boolean
        page_url:
          type: string
          format: uri
    Error:
      type: object
      properties:
        message:
          type: string
        status:
          type: string
          description: >-
            Présent uniquement sur certains échecs applicatifs, ex. paiement
            dupliqué sur `POST /payments` où `status` vaut toujours `failed`.
            Absent des autres erreurs de ce contrat (ex. 404 `Payment Not
            Found`, erreurs d'en-tête/authentification).
          x-verified: >-
            Note interne de vérification (non destinée à la documentation
            publique). Voir `Live::PaymentService#error_response`
            (app/services/live/payment_service.rb:994-1005).
          example: failed
    ValidationError:
      type: object
      properties:
        errors:
          type: array
          items:
            type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Clé secrète du compte Sandbox ou Live

````