> ## 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.

# Consulter un lien de paiement

> Lisez l'état d'un lien de paiement à partir de sa référence. Aucune clé n'est requise.

<Warning>
  Cette opération ne demande aucune clé. Toute personne qui connaît la référence peut consulter l'état du lien et, une fois un paiement complété, les informations du payeur qu'il contient. Générez toujours cette référence de façon aléatoire et à forte entropie (voir [Créer un lien de paiement hébergé](/api-reference/liens-de-paiement/creer-un-lien)), et ne la journalisez ni ne l'affichez dans un contexte accessible à un tiers non concerné par ce paiement.
</Warning>

* **Forme de la réponse.** Elle dépend de l'état réel du lien : un paiement mené à son terme, un lien encore en attente d'un premier essai de paiement, ou un lien expiré sans paiement complété. Un remboursement effectué après coup ne modifie pas cette forme : cette opération n'est pas un indicateur fiable pour détecter un remboursement.
* **Lien expiré.** Passé le délai de trente minutes sans paiement complété, la consultation répond toujours `200`, avec `has_expire` à `true` et `status` à `cancelled`. Traitez cette forme comme un lien définitivement inutilisable, et non comme une erreur transitoire à retenter.
* **Référence inconnue.** Une référence qui ne correspond à aucun lien renvoie `404`. Comme l'opération est publique, une énumération par force brute est possible si la référence n'est pas assez aléatoire : c'est la raison de l'avertissement ci-dessus.

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


## OpenAPI

````yaml openapi.yaml GET /external_payments/{reference}
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/{reference}:
    get:
      tags:
        - Payment links
      summary: Consulter un lien de paiement
      description: >-
        Cette route est actuellement accessible sans clé et peut retourner des
        données client. Utilisez une référence privée générée aléatoirement,
        jamais un identifiant de commande séquentiel.
      parameters:
        - name: reference
          in: path
          required: true
          description: Référence privée à forte entropie, non publiée côté client.
          schema:
            type: string
            minLength: 32
      responses:
        '200':
          description: État du lien ou du paiement associé
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/ExternalPaymentStatus'
                  - $ref: '#/components/schemas/ExternalPaymentWaiting'
                  - $ref: '#/components/schemas/ExternalPaymentExpired'
        '404':
          description: Lien introuvable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security: []
components:
  schemas:
    ExternalPaymentStatus:
      type: object
      description: >-
        Forme renvoyée lorsqu'un paiement a été mené à son terme pour ce lien.
        `status` ne peut alors valoir que `succeeded` ou `failed` : sur cette
        opération, jamais `initiated`, `pending` ni `refunded`. Cas limite : un
        paiement remboursé après coup n'est plus rattaché au lien, et
        l'opération renvoie alors la forme d'un lien encore en attente (`status:
        initiated`) au lieu d'exposer le remboursement — ne pas utiliser cette
        opération comme indicateur fiable de remboursement.
      x-verified: >-
        Note interne de vérification (non destinée à la documentation publique).
        Vérifié le 2026-09-16 dans `Api::V1::ExternalPaymentsController#show`
        (app/controllers/api/v1/external_payments_controller.rb:41-59, 63-92) :
        ce schéma n'est rendu que pour `most_recent_successful ||
        most_recent_failed`, deux scopes filtrés respectivement sur
        `payments.status = 2` et `payments.status = 3` (lignes 68-73), à
        comparer à l'énumération `Payment.status` (app/models/payment.rb:119 —
        initiated:0, pending:1, succeeded:2, failed:3, refunded:4).
        L'énumération existante était déjà exacte, confirmée plutôt que
        corrigée. Si un paiement `succeeded` est ensuite marqué `refunded` en
        base, il ne correspond plus à aucun des deux scopes SQL et cette route
        rend alors `ExternalPaymentWaiting`.
      properties:
        reference:
          type: string
        amount:
          type: integer
        country:
          type: string
        currency:
          type: string
        transaction_id:
          type: string
        msisdn:
          type: string
        customer_name:
          type: string
        status:
          type: string
          enum:
            - succeeded
            - failed
        created_at:
          type: string
          format: date-time
    ExternalPaymentWaiting:
      type: object
      properties:
        message:
          type: string
        status:
          type: string
          const: initiated
        reference:
          type: string
        page_url:
          type: string
          format: uri
    ExternalPaymentExpired:
      type: object
      properties:
        message:
          type: string
        has_expire:
          type: boolean
          const: true
        status:
          type: string
          const: cancelled
        reference:
          type: string
    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

````