> ## Documentation Index
> Fetch the complete documentation index at: https://doc.ashtechpay.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Paiements crypto

> Acceptez des paiements crypto avec une adresse et un réseau précis.

## Lister les actifs

> [tab] Node.js
>
> ```javascript theme={null}
> const response = await fetch("https://www.ashtechpay.com/v1/crypto/assets", {
>   headers: {
>     Authorization: `Bearer ${process.env.ASHTECH_API_KEY}`,
>   },
> });
> const assets = await response.json();
> ```

> [tab] Python
>
> ```python theme={null}
> import os
> import requests
>
> response = requests.get(
>     "https://www.ashtechpay.com/v1/crypto/assets",
>     headers={"Authorization": f"Bearer {os.environ['ASHTECH_API_KEY']}"},
> )
> assets = response.json()
> ```

> [tab] cURL
>
> ```bash theme={null}
> curl https://www.ashtechpay.com/v1/crypto/assets \
>   -H "Authorization: Bearer $ASHTECH_API_KEY"
> ```

> [tab] PHP / Laravel
>
> ```php theme={null}
> <?php
>
> $ch = curl_init("https://www.ashtechpay.com/v1/crypto/assets");
> curl_setopt_array($ch, [
>     CURLOPT_RETURNTRANSFER => true,
>     CURLOPT_HTTPHEADER => [
>         "Authorization: Bearer " . getenv("ASHTECH_API_KEY"),
>     ],
> ]);
>
> $assets = json_decode(curl_exec($ch), true);
> curl_close($ch);
> ```

Choisissez un `asset_code` retourné par l'API. Ne supposez pas que tous les réseaux sont actifs.

## Créer un paiement crypto

> [!WARNING]
>
> Pour tout paiement crypto, les trois informations client sont obligatoires :
> `customer.email`, `customer.firstName` et `customer.lastName`. La requête est
> refusée si l'une de ces valeurs manque ou n'est pas valide.

```http theme={null}
POST https://www.ashtechpay.com/v1/crypto/collect
```

> [tab] Node.js
>
> ```javascript theme={null}
> const response = await fetch("https://www.ashtechpay.com/v1/crypto/collect", {
>   method: "POST",
>   headers: {
>     Authorization: `Bearer ${process.env.ASHTECH_API_KEY}`,
>     "Content-Type": "application/json",
>   },
>   body: JSON.stringify({
>     user_id: "VOTRE_USER_ID",
>     amount: "25",
>     currency: "USDT",
>     asset_code: "USDT.TRC20",
>     country: "CM",
>     reference: "crypto_order_12345",
>     customer: {
>       email: "payer@example.com",
>       firstName: "Ada",
>       lastName: "Lovelace"
>     },
>     notify_url: "https://example.com/webhooks/ashtechpay",
>   }),
> });
> const payment = await response.json();
> ```

> [tab] Python
>
> ```python theme={null}
> import os
> import requests
>
> response = requests.post(
>     "https://www.ashtechpay.com/v1/crypto/collect",
>     headers={
>         "Authorization": f"Bearer {os.environ['ASHTECH_API_KEY']}",
>         "Content-Type": "application/json",
>     },
>     json={
>         "user_id": "VOTRE_USER_ID",
>         "amount": "25",
>         "currency": "USDT",
>         "asset_code": "USDT.TRC20",
>         "country": "CM",
>         "reference": "crypto_order_12345",
>         "customer": {
>             "email": "payer@example.com",
>             "firstName": "Ada",
>             "lastName": "Lovelace"
>         },
>         "notify_url": "https://example.com/webhooks/ashtechpay",
>     },
> )
> payment = response.json()
> ```

> [tab] cURL
>
> ```bash theme={null}
> curl -X POST https://www.ashtechpay.com/v1/crypto/collect \
>   -H "Authorization: Bearer $ASHTECH_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "user_id": "VOTRE_USER_ID",
>     "amount": "25",
>     "currency": "USDT",
>     "asset_code": "USDT.TRC20",
>     "country": "CM",
>     "reference": "crypto_order_12345",
>     "customer": {
>       "email": "payer@example.com",
>       "firstName": "Ada",
>       "lastName": "Lovelace"
>     },
>     "notify_url": "https://example.com/webhooks/ashtechpay"
>   }'
> ```

> [tab] PHP / Laravel
>
> ```php theme={null}
> <?php
>
> $payload = [
>     "user_id" => "VOTRE_USER_ID",
>     "amount" => "25",
>     "currency" => "USDT",
>     "asset_code" => "USDT.TRC20",
>     "country" => "CM",
>     "reference" => "crypto_order_12345",
>     "customer" => [
>         "email" => "payer@example.com",
>         "firstName" => "Ada",
>         "lastName" => "Lovelace",
>     ],
>     "notify_url" => "https://example.com/webhooks/ashtechpay",
> ];
>
> $ch = curl_init("https://www.ashtechpay.com/v1/crypto/collect");
> curl_setopt_array($ch, [
>     CURLOPT_POST => true,
>     CURLOPT_RETURNTRANSFER => true,
>     CURLOPT_HTTPHEADER => [
>         "Authorization: Bearer " . getenv("ASHTECH_API_KEY"),
>         "Content-Type: application/json",
>     ],
>     CURLOPT_POSTFIELDS => json_encode($payload),
> ]);
>
> $payment = json_decode(curl_exec($ch), true);
> curl_close($ch);
> ```

### Réponse de création (HTTP 202)

Une nouvelle collecte renvoie `202 Accepted` avec une transaction en attente.
Voici le contrat de réponse exact. Les valeurs ci-dessous indiquent les types,
pas un paiement ni une adresse réels :

```ts theme={null}
type CryptoCollectResponse = {
  transaction_id: string;
  reference: string;
  merchant_reference: string | null;
  status: "pending";
  payment_method: "crypto";
  asset_code: string;
  network: string;
  address: string;
  memo: string | null;
  memo_type: string | null;
  amount: number;
  currency: string;
  amount_usdt: number;
  credited_amount: number;
  fee_amount: number;
  gross_amount_usdt: number;
  provider_fee_percent: number;
  provider_fee_amount_usdt: number;
  ashtech_fee_percent: number;
  ashtech_fee_amount_usdt: number;
  total_fee_percent: number;
  total_fee_amount_usdt: number;
  credited_amount_usdt: number;
  fee_amount_usdt: number;
  fee_percent: number;
  expires_at: string | null;
  created_at: string | null;
};
```

`network` est l'identifiant du réseau retourné par `/v1/crypto/assets`.
`amount` et `currency` reprennent le montant demandé; les champs `*_usdt`,
`credited_amount` et `fee_amount` contiennent les montants calculés par
l'API en USDT. L'adresse, le memo/tag, les frais et l'expiration sont des
valeurs produites à l'exécution : ne les inventez pas et ne lancez pas un
paiement réel uniquement pour découvrir la structure de la réponse.

Le champ d'entrée `reference` est facultatif et limité à 191 caractères; il
est retourné sous `merchant_reference`. Un nouvel appel avec la même
`reference` et les mêmes paramètres peut renvoyer `200 OK` avec
`idempotent_replay: true`. Dans ce cas, `status` reflète l'état déjà enregistré
et peut différer de `pending`. Si deux requêtes arrivent pendant que la
première crée encore l'adresse, la seconde peut renvoyer `202 pending` sans
adresse. Consultez alors `GET /v1/transaction/{transaction_id}?user_id=VOTRE_USER_ID` pour récupérer
l'adresse dès qu'elle est prête; ne créez pas une nouvelle référence pour
relancer le paiement.

### Champ `customer`

`customer` doit être un objet JSON, jamais une chaîne ou un tableau :

```json theme={null}
{
  "customer": {
    "email": "payer@example.com",
    "firstName": "Ada",
    "lastName": "Lovelace"
  }
}
```

Les trois champs `email`, `firstName` et `lastName` sont obligatoires pour le Hosted Checkout crypto comme pour la Direct API. N'inventez jamais ces informations : demandez-les au payeur ou arrêtez la requête avec une erreur explicite.

## Adresse et QR code

La réponse fournit une adresse de paiement et, selon le réseau, un `memo` ou un `tag`. Conservez ces valeurs séparées et affichez le QR code côté application avec le format correspondant au réseau.

> [!WARNING]
>
> Un paiement crypto doit utiliser exactement le réseau retourné par l'API. Une adresse ou un réseau incorrect peut rendre les fonds irrécupérables.

### Expiration de l'adresse

L'adresse créée est temporaire. La réponse de création retourne `expiresAt`
pour le Hosted Checkout et `expires_at` dans le statut Direct API, sous forme
de date/heure ISO 8601 lorsque cette valeur est disponible. Le client
doit envoyer les fonds avant cette date.

Indépendamment du compte à rebours affiché dans l'interface, AshTech Pay
considère une transaction Crypto restée `pending` comme expirée après **15
minutes**. Le statut serveur et le webhook restent la source de vérité :
attendez la confirmation `completed` avant de livrer une commande et ne
réutilisez pas une adresse après son expiration.

## Crédit et confirmation

Le paiement n'est considéré comme terminé qu'après confirmation par AshTech Pay. Attendez le webhook `completed` avant de livrer une commande.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.