Source: https://cryptanio.com/es/docs/reference/create-invoice/
Contract / release / updated: v1 / 1.0.0 62 / 2026-10-10

[Referencia de la API](https://cryptanio.com/es/docs.html#reference)

# Crea una factura

POST `/v1/invoices`

Contrato v1 / 1.0.0 62 / 2026-10-10

[Markdown](https://cryptanio.com/es/docs/reference/create-invoice/index.md) [OpenAPI](https://cryptanio.com/openapi.json)

Crear una factura de Payments. Envíe chain y amount para obtener datos de pago fijos, o bien omita chain, asset, amount, address y tolerance y envíe invoice_currency e invoice_amount para que el pagador elija el método. Esta última opción requiere una clave de producción con permiso de escritura e Idempotency-Key; la creación y un reintento idéntico devuelven la URL de pago interactiva. GET y los listados mantienen enlaces de solo lectura. Tras un tiempo de espera agotado, repita el mismo cuerpo con el mismo Idempotency-Key; otros parámetros devuelven 409. Un reintento con clave devuelve 201 con el mismo ID. Sin clave, repetir una creación con método fijo puede crear otra factura. No crea un pago en la cadena de bloques.

Permisos de la clave: `invoices` / write / `payments`.

## Parámetros

| Parámetro | Entrante | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `Idempotency-Key` | header | No | 16–80 letras ASCII, dígitos, guiones o guiones bajos. ID lógico de pedido único dentro de la cuenta. Obligatorio cuando el pagador elige el método de pago.; `string` minLength: `16`; maxLength: `80`; pattern: `^[A-Za-z0-9_-]+$` |

## Cuerpo de la solicitud

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `project` | `string` | No | ID del proyecto Payments; se recomienda seleccionarlo explícitamente. Una clave limitada a un proyecto usa su proyecto. |
| `chain` | `string` | No | Código de red.; minLength: `1` |
| `asset` | `string` | No | Activo de pago compatible: native, símbolo o identificador conocido. Los activos aceptados dependen de la red; si se omite, se selecciona native.; Predeterminado: `native` |
| `amount` | `string` | No | Importe cripto positivo en unidades del activo; la precisión no debe superar sus decimales.; pattern: `^[0-9]+(?:\.[0-9]+)?$` |
| `reference` | `string` | No | Tu referencia del pedido; no sustituye a Idempotency-Key.; maxLength: `120` |
| `address` | `string` | No | Dirección opcional del pool de pagos del proyecto. Si se omite, el servicio selecciona una. |
| `tolerance` | `string` | No | Pago insuficiente permitido en unidades del activo, estrictamente inferior a amount. Omítelo para una tolerancia cero.; pattern: `^[0-9]+(?:\.[0-9]+)?$` |
| `customer` | `object` | No |  |
| `product` | `object` | No |  |
| `payer` | `object` | No |  |
| `metadata` | `object` | No | Hasta 20 pares, máximo 8192 bytes JSON. No incluyas secretos. |
| `invoice_currency` | `string` | No | Moneda de tres letras de la cotización del pedido; solo junto con invoice_amount.; pattern: `^[A-Za-z]{3}$` |
| `invoice_amount` | `string` | No | Importe positivo del pedido en invoice_currency. Junto con chain y amount, es la instantánea del comerciante. Sin datos de pago, es el valor fijo de la factura que se utiliza para calcular el activo elegido por el pagador.; maxLength: `80`; pattern: `^[0-9]+(?:\.[0-9]+)?$` |
| `expires_in` | `integer` | No | Plazo de pago en minutos, a partir de la emisión correcta de los datos. Si se omite o se indica 0, se aplica la política del proyecto (60 de forma predeterminada); máximo 10080. Las solicitudes anteriores con método fijo también consideran los valores negativos como omitidos; el pago con elección de método rechaza los valores negativos.; Predeterminado: `60`; maximum: `10080` |



### application/json

```json
{
  "project": "2002",
  "invoice_currency": "USD",
  "invoice_amount": "12.50",
  "reference": "order-42"
}
```



## Ejemplos de solicitudes

Los ejemplos realizan una operación real en tu cuenta. Configura las variables de entorno indicadas en el código. Mantén tu clave privada; las solicitudes de escritura no se reintentan automáticamente.



### Shell / cURL

```bash
#!/usr/bin/env bash
set -euo pipefail
: "${CRYPTANIO_API_KEY:?Set CRYPTANIO_API_KEY}"
: "${CRYPTANIO_OPERATION_ID:?Set CRYPTANIO_OPERATION_ID}"
: "${CRYPTANIO_PROJECT_ID:?Set CRYPTANIO_PROJECT_ID}"
json_string() {
  local text="$1" char code index output='"'
  for ((index=0; index<${#text}; index++)); do
    char="${text:index:1}"
    case "$char" in
      '"'|'\') output+="\\$char" ;;
      *) printf -v code '%d' "'$char"
         if ((code < 32)); then printf -v char '\\u%04x' "$code"; fi
         output+="$char" ;;
    esac
  done
  printf '%s"' "$output"
}
response_file="$(mktemp)"
trap 'rm -f "$response_file"' EXIT
transfer_status=0
http_status="$(curl \
  --silent --show-error --max-time 30 --request POST \
  --header "Authorization: Bearer $CRYPTANIO_API_KEY" \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header "Idempotency-Key: $CRYPTANIO_OPERATION_ID" \
  --data-binary '{"project":'"$(json_string "$CRYPTANIO_PROJECT_ID")"',"invoice_currency":"USD","invoice_amount":"12.50","reference":"order-42"}' \
  "https://api.cryptanio.com/v1/invoices" \
  --output "$response_file" --write-out '%{http_code}')" || transfer_status=$?
if [[ "$http_status" == 2?? ]]; then
  cat "$response_file"
  exit "$transfer_status"
fi
printf 'HTTP %s\n' "$http_status" >&2
cat "$response_file" >&2
exit 1
```



[Descargar ejemplo](https://cryptanio.com/files/examples/api/create-invoice.sh)



### Go

```go
// Go; standard library only. Run: go run request.go
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "net/url"
    "os"
    "time"
)

func env(name string) string {
    value := os.Getenv(name)
    if value == "" { fmt.Fprintln(os.Stderr, "Set", name); os.Exit(1) }
    return value
}
func run() error {
    path := "/v1/invoices"

    endpoint, err := url.Parse("https://api.cryptanio.com" + path)
    if err != nil { return err }
    query := endpoint.Query()

    endpoint.RawQuery = query.Encode()
    var payload map[string]any
    if err := json.Unmarshal([]byte("{\"project\":\"2002\",\"invoice_currency\":\"USD\",\"invoice_amount\":\"12.50\",\"reference\":\"order-42\"}"), &payload); err != nil { return err }
    payload["project"] = env("CRYPTANIO_PROJECT_ID")
    body, err := json.Marshal(payload)
    if err != nil { return err }
    request, err := http.NewRequest("POST", endpoint.String(), bytes.NewReader(body))
    if err != nil { return err }
    request.Header.Set("Authorization", "Bearer " + env("CRYPTANIO_API_KEY"))
    request.Header.Set("Accept", "application/json")
    request.Header.Set("Content-Type", "application/json")
    request.Header.Set("Idempotency-Key", env("CRYPTANIO_OPERATION_ID"))
    client := &http.Client{Timeout: 30 * time.Second, CheckRedirect: func(*http.Request, []*http.Request) error { return http.ErrUseLastResponse }}
    response, err := client.Do(request)
    if err != nil { return err }
    defer response.Body.Close()
    if response.StatusCode < 200 || response.StatusCode >= 300 {
        body, err := io.ReadAll(response.Body)
        if err != nil { return err }
        return fmt.Errorf("HTTP %d: %s", response.StatusCode, body)
    }
    _, err = io.Copy(os.Stdout, response.Body)
    return err
}
func main() {
    if err := run(); err != nil { fmt.Fprintln(os.Stderr, err); os.Exit(1) }
}
```



[Descargar ejemplo](https://cryptanio.com/files/examples/api/create-invoice.go)



### Rust

```rust
// Cargo.toml dependencies:
// reqwest = { version = "=0.12.24", features = ["blocking", "json"] }
// serde_json = "=1.0.145"
use std::{error::Error, io, time::Duration};
use reqwest::{blocking::Client, redirect::Policy, Method, Url};

fn env(name: &str) -> Result<String, Box<dyn Error>> {
    let value = std::env::var(name)?;
    if value.is_empty() { return Err(format!("Set {name}").into()); }
    Ok(value)
}
fn run() -> Result<(), Box<dyn Error>> {
    let mut url = Url::parse("https://api.cryptanio.com")?;
    {
        let mut segments = url.path_segments_mut().map_err(|_| "Invalid base URL")?;
        segments.clear();
        segments.push("v1");
        segments.push("invoices");
    }
    let client = Client::builder().timeout(Duration::from_secs(30)).redirect(Policy::none()).build()?;
    let request = client.request(Method::POST, url)
        .header("Authorization", format!("Bearer {}", env("CRYPTANIO_API_KEY")?))
        .header("Accept", "application/json".to_owned())
        .header("Content-Type", "application/json".to_owned())
        .header("Idempotency-Key", env("CRYPTANIO_OPERATION_ID")?);
    let mut body: serde_json::Value = serde_json::from_str("{\"project\":\"2002\",\"invoice_currency\":\"USD\",\"invoice_amount\":\"12.50\",\"reference\":\"order-42\"}")?;
    body["project"] = serde_json::Value::String(env("CRYPTANIO_PROJECT_ID")?);
    let request = request.json(&body);
    let mut response = request.send()?;
    let status = response.status();
    if !status.is_success() { return Err(format!("HTTP {}: {}", status.as_u16(), response.text()?).into()); }
    io::copy(&mut response, &mut io::stdout())?;
    Ok(())
}
fn main() {
    if let Err(error) = run() { eprintln!("{error}"); std::process::exit(1); }
}
```



[Descargar ejemplo](https://cryptanio.com/files/examples/api/create-invoice.rs)



### PHP

```php
<?php
// PHP 8 with the cURL extension. Run this on your server.
function env(string $name): string {
    $value = getenv($name);
    if ($value === false || $value === '') throw new RuntimeException('Set ' . $name);
    return $value;
}
try {
    $path = '/v1/invoices';

    $query = [

    ];
    $url = 'https://api.cryptanio.com' . $path . ($query ? '?' . http_build_query($query, '', '&', PHP_QUERY_RFC3986) : '');
    $headers = [
        'Authorization: ' . 'Bearer ' . env('CRYPTANIO_API_KEY'),
        'Accept: ' . 'application/json',
        'Content-Type: ' . 'application/json',
        'Idempotency-Key: ' . env('CRYPTANIO_OPERATION_ID'),
    ];
    $body = json_decode('{"project":"2002","invoice_currency":"USD","invoice_amount":"12.50","reference":"order-42"}', true, 512, JSON_THROW_ON_ERROR);
    $body['project'] = env('CRYPTANIO_PROJECT_ID');
    $curl = curl_init($url);
    curl_setopt_array($curl, [
        CURLOPT_CUSTOMREQUEST => 'POST',
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => false,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_POSTFIELDS => json_encode($body, JSON_THROW_ON_ERROR),
    ]);
    $response = curl_exec($curl);
    if ($response === false) throw new RuntimeException(curl_error($curl));
    $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    if ($status < 200 || $status >= 300) throw new RuntimeException('HTTP ' . $status . ': ' . $response);
    echo $response;
} catch (Throwable $error) {
    fwrite(STDERR, $error->getMessage() . PHP_EOL);
    exit(1);
}
```



[Descargar ejemplo](https://cryptanio.com/files/examples/api/create-invoice.php)



### Python

```python
# Python 3; standard library only.
import json
import os
import sys
from urllib.error import HTTPError, URLError
from urllib.parse import quote, urlencode
from urllib.request import HTTPRedirectHandler, Request, build_opener

def env(name):
    result = os.environ.get(name)
    if not result:
        raise ValueError("Set " + name)
    return result

class NoRedirect(HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, headers, newurl):
        return None

try:
    path = "/v1/invoices"

    query = {

    }
    url = "https://api.cryptanio.com" + path + ("?" + urlencode(query) if query else "")
    headers = {
        "Authorization": "Bearer " + env("CRYPTANIO_API_KEY"),
        "Accept": "application/json",
        "Content-Type": "application/json",
        "Idempotency-Key": env("CRYPTANIO_OPERATION_ID"),
    }
    body = json.loads("{\"project\":\"2002\",\"invoice_currency\":\"USD\",\"invoice_amount\":\"12.50\",\"reference\":\"order-42\"}")
    body["project"] = env("CRYPTANIO_PROJECT_ID")
    data = json.dumps(body).encode("utf-8")
    request = Request(url, data=data, headers=headers, method="POST")
    with build_opener(NoRedirect()).open(request, timeout=30) as response:
        if not 200 <= response.status < 300:
            raise ValueError("HTTP " + str(response.status))
        sys.stdout.buffer.write(response.read())
except HTTPError as error:
    print("HTTP " + str(error.code) + ": " + error.read().decode("utf-8", errors="replace"), file=sys.stderr)
    sys.exit(1)
except (ValueError, URLError, OSError) as error:
    print(str(error), file=sys.stderr)
    sys.exit(1)
```



[Descargar ejemplo](https://cryptanio.com/files/examples/api/create-invoice.py)



### Node.js

```javascript
// Node.js 18+. Run on your server, never in a browser.
const env = name => {
  const result = process.env[name];
  if (!result) throw new Error(`Set ${name}`);
  return result;
};
try {
  let path = "/v1/invoices";

  const url = new URL(path, "https://api.cryptanio.com");

  const headers = {
    "Authorization": "Bearer " + env("CRYPTANIO_API_KEY"),
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Idempotency-Key": env("CRYPTANIO_OPERATION_ID"),
  };
  const body = {
    "project": "2002",
    "invoice_currency": "USD",
    "invoice_amount": "12.50",
    "reference": "order-42"
  };
  body["project"] = env("CRYPTANIO_PROJECT_ID");
  const response = await fetch(url, {
    method: "POST", headers, redirect: "manual",
    signal: AbortSignal.timeout(30_000), body: JSON.stringify(body),
  });
  if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
  if (response.body) {
    for await (const chunk of response.body) process.stdout.write(chunk);
  }
} catch (error) {
  console.error(error.message);
  process.exitCode = 1;
}
```



[Descargar ejemplo](https://cryptanio.com/files/examples/api/create-invoice.mjs)

## Respuestas y errores

### 201 Respuesta correcta.

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `checkout_url` | `string` | No | Página de pago alojada por Cryptanio. La creación o el reintento de una factura con elección de método devuelve un enlace de acceso interactivo que permite elegirlo hasta que se detecte un pago. La creación con método fijo y todos los GET y listados devuelven un enlace independiente de solo lectura. Comparta cualquiera de los enlaces solo con el pagador previsto; ninguno da acceso a la cuenta ni a la clave API. Confirme el pago mediante la API de facturas o un webhook verificado, no mediante una redirección del navegador.; `uri` |
| `id` | `string` | Sí | Identificador opaco; consérvalo como cadena.; minLength: `1` |
| `status` | `string` | Sí | pending espera el pago; seen detectado; partial parcialmente pagado; paid liquidado; underpaid/overpaid/late requieren una decisión; expired plazo vencido; canceled anulado.; `pending`, `seen`, `paid`, `underpaid`, `partial`, `overpaid`, `expired`, `late`, `canceled` |
| `project_id` | `string` | Sí | Identificador opaco; consérvalo como cadena.; minLength: `1` |
| `reference` | `string` | No | Referencia del pedido. |
| `customer` | `object` | No |  |
| `product` | `object` | No |  |
| `payer` | `object` | No |  |
| `metadata` | `object` | No | Hasta 20 pares, máximo 8192 bytes JSON. No incluyas secretos. |
| `invoice_currency` | `string` | No | Moneda de la cotización del pedido. |
| `invoice_amount` | `string` | No | Importe decimal exacto como cadena; no uses coma flotante.; pattern: `^[0-9]+(?:\.[0-9]+)?$` |
| `chain` | `string` | Sí | Código de red. |
| `asset` | `string` | Sí | Activo de pago. |
| `address` | `string` | Sí | Dirección de pago. |
| `payment_route` | `object` | No | Identificador de pago en la cadena obligatorio cuando una fuente automática genera un tag, memo, comentario TON o referencia Solana Pay. Consérvelo junto con la dirección de recepción; la referencia del pedido del comercio es un campo independiente. |
| `payment_uri` | `string` | No | Solicitud de transferencia Solana Pay con el destinatario, el importe exacto, el mint del token admitido y la referencia obligatoria. Codifique este URI en el QR de pago en lugar de la dirección de recepción sin más datos.; `uri` |
| `amount` | `string \| string` | Sí | Importe real que debe enviar el comprador; puede diferir del solicitado para distinguir facturas. Vacío hasta que se elija un método. |
| `amount_raw` | `string \| string` | Sí | Importe entero en la unidad mínima, como cadena de texto. Vacío hasta que se elija un método. |
| `asked` | `string \| string` | Sí | Importe de criptomoneda solicitado originalmente. Vacío hasta que se elija un método. |
| `decimals` | `integer` | Sí | Decimales del activo.; minimum: `0` |
| `tolerance` | `string` | No | Tolerancia en unidades mínimas; a diferencia de request.tolerance.; pattern: `^[0-9]+$` |
| `sandbox` | `boolean` | Sí | Una factura de prueba no demuestra un pago real en la blockchain. |
| `needs_decision` | `boolean` | No | Los estados underpaid, overpaid o late requieren una decisión. |
| `paid` | `string` | No | Importe recibido en unidades mínimas.; pattern: `^[0-9]+$` |
| `tx_id` | `string` | No | Identificador de la transacción de pago. |
| `paid_at` | `string` | No | Fecha y hora UTC en RFC 3339.; `date-time` |
| `expires_at` | `string` | Sí | Fecha y hora UTC en RFC 3339.; `date-time` |
| `created_at` | `string` | Sí | Fecha y hora UTC en RFC 3339.; `date-time` |



### 201 application/json

```json
{
  "id": "2100",
  "status": "pending",
  "project_id": "2002",
  "reference": "order-42",
  "chain": "ethereum",
  "asset": "USDC",
  "address": "0x52908400098527886E0F7030069857D2E4169EE7",
  "amount": "12.5",
  "amount_raw": "12500000",
  "asked": "12.5",
  "decimals": 6,
  "sandbox": true,
  "expires_at": "2026-10-06T11:00:00Z",
  "created_at": "2026-10-06T10:00:00Z"
}
```



### 400 Solicitud inválida (bad_request, unsupported_asset).

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `error` | `object` | Sí |  |



### 400 application/json

```json
{
  "error": {
    "code": "forbidden",
    "message": "this API key is read-only"
  }
}
```



### 401 No hay una clave API activa válida (unauthorized).

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `error` | `object` | Sí |  |



### 401 application/json

```json
{
  "error": {
    "code": "forbidden",
    "message": "this API key is read-only"
  }
}
```



### 403 La clave no permite la operación, el proyecto, el servicio o la IP; correo sin confirmar.

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `error` | `object` | Sí |  |



### 403 application/json

```json
{
  "error": {
    "code": "forbidden",
    "message": "this API key is read-only"
  }
}
```



### 409 Conflicto de estado, parámetros de reintento distintos o límite de recursos de pago (conflict, limit_reached, service_inactive).

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `error` | `object` | Sí |  |



### 409 application/json

```json
{
  "error": {
    "code": "forbidden",
    "message": "this API key is read-only"
  }
}
```



### 429 Demasiadas solicitudes (rate_limited); reintenta después de Retry-After.

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `error` | `object` | Sí |  |



### 429 application/json

```json
{
  "error": {
    "code": "forbidden",
    "message": "this API key is read-only"
  }
}
```



### 500 Error interno (internal).

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `error` | `object` | Sí |  |



### 500 application/json

```json
{
  "error": {
    "code": "forbidden",
    "message": "this API key is read-only"
  }
}
```



### 503 Indisponibilidad temporal (unavailable); reintenta con espera progresiva.

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `error` | `object` | Sí |  |



### 503 application/json

```json
{
  "error": {
    "code": "forbidden",
    "message": "this API key is read-only"
  }
}
```



[Gestión de errores y reintentos seguros](https://cryptanio.com/es/docs.html#errors)

## Objetos anidados

### `Invoice`

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `checkout_url` | `string` | No | Página de pago alojada por Cryptanio. La creación o el reintento de una factura con elección de método devuelve un enlace de acceso interactivo que permite elegirlo hasta que se detecte un pago. La creación con método fijo y todos los GET y listados devuelven un enlace independiente de solo lectura. Comparta cualquiera de los enlaces solo con el pagador previsto; ninguno da acceso a la cuenta ni a la clave API. Confirme el pago mediante la API de facturas o un webhook verificado, no mediante una redirección del navegador.; `uri` |
| `id` | `string` | Sí | Identificador opaco; consérvalo como cadena.; minLength: `1` |
| `status` | `string` | Sí | pending espera el pago; seen detectado; partial parcialmente pagado; paid liquidado; underpaid/overpaid/late requieren una decisión; expired plazo vencido; canceled anulado.; `pending`, `seen`, `paid`, `underpaid`, `partial`, `overpaid`, `expired`, `late`, `canceled` |
| `project_id` | `string` | Sí | Identificador opaco; consérvalo como cadena.; minLength: `1` |
| `reference` | `string` | No | Referencia del pedido. |
| `customer` | `object` | No |  |
| `product` | `object` | No |  |
| `payer` | `object` | No |  |
| `metadata` | `object` | No | Hasta 20 pares, máximo 8192 bytes JSON. No incluyas secretos. |
| `invoice_currency` | `string` | No | Moneda de la cotización del pedido. |
| `invoice_amount` | `string` | No | Importe decimal exacto como cadena; no uses coma flotante.; pattern: `^[0-9]+(?:\.[0-9]+)?$` |
| `chain` | `string` | Sí | Código de red. |
| `asset` | `string` | Sí | Activo de pago. |
| `address` | `string` | Sí | Dirección de pago. |
| `payment_route` | `object` | No | Identificador de pago en la cadena obligatorio cuando una fuente automática genera un tag, memo, comentario TON o referencia Solana Pay. Consérvelo junto con la dirección de recepción; la referencia del pedido del comercio es un campo independiente. |
| `payment_uri` | `string` | No | Solicitud de transferencia Solana Pay con el destinatario, el importe exacto, el mint del token admitido y la referencia obligatoria. Codifique este URI en el QR de pago en lugar de la dirección de recepción sin más datos.; `uri` |
| `amount` | `string \| string` | Sí | Importe real que debe enviar el comprador; puede diferir del solicitado para distinguir facturas. Vacío hasta que se elija un método. |
| `amount_raw` | `string \| string` | Sí | Importe entero en la unidad mínima, como cadena de texto. Vacío hasta que se elija un método. |
| `asked` | `string \| string` | Sí | Importe de criptomoneda solicitado originalmente. Vacío hasta que se elija un método. |
| `decimals` | `integer` | Sí | Decimales del activo.; minimum: `0` |
| `tolerance` | `string` | No | Tolerancia en unidades mínimas; a diferencia de request.tolerance.; pattern: `^[0-9]+$` |
| `sandbox` | `boolean` | Sí | Una factura de prueba no demuestra un pago real en la blockchain. |
| `needs_decision` | `boolean` | No | Los estados underpaid, overpaid o late requieren una decisión. |
| `paid` | `string` | No | Importe recibido en unidades mínimas.; pattern: `^[0-9]+$` |
| `tx_id` | `string` | No | Identificador de la transacción de pago. |
| `paid_at` | `string` | No | Fecha y hora UTC en RFC 3339.; `date-time` |
| `expires_at` | `string` | Sí | Fecha y hora UTC en RFC 3339.; `date-time` |
| `created_at` | `string` | Sí | Fecha y hora UTC en RFC 3339.; `date-time` |

### `ID`

Identificador opaco. Su formato no está garantizado; no lo conviertas a número.

`string` Identificador opaco. Su formato no está garantizado; no lo conviertas a número.

### `InvoiceStatus`

pending espera el pago; seen detectado; partial parcialmente pagado; paid liquidado; underpaid/overpaid/late requieren una decisión; expired plazo vencido; canceled anulado.

`string` pending espera el pago; seen detectado; partial parcialmente pagado; paid liquidado; underpaid/overpaid/late requieren una decisión; expired plazo vencido; canceled anulado.

### `Customer`

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `id` | `string` | Sí | Identificador del cliente en tu sistema.; maxLength: `120` |

### `Product`

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `id` | `string` | No | Identificador del producto en tu sistema.; maxLength: `120` |
| `name` | `string` | No | Nombre del producto.; maxLength: `200` |
| `quantity` | `integer` | No | Cantidad.; minimum: `1`; maximum: `1000000` |

### `Payer`

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `comment` | `string` | Sí | Comentario del pagador.; maxLength: `500` |

### `InvoiceMetadata`

Hasta 20 pares, máximo 8192 bytes JSON. No incluyas secretos.

`object` Hasta 20 pares, máximo 8192 bytes JSON. No incluyas secretos.

### `Decimal`

`string`

### `RawAmount`

`string`

### `InvoiceRequest`

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `project` | `string` | No | ID del proyecto Payments; se recomienda seleccionarlo explícitamente. Una clave limitada a un proyecto usa su proyecto. |
| `chain` | `string` | No | Código de red.; minLength: `1` |
| `asset` | `string` | No | Activo de pago compatible: native, símbolo o identificador conocido. Los activos aceptados dependen de la red; si se omite, se selecciona native.; Predeterminado: `native` |
| `amount` | `string` | No | Importe cripto positivo en unidades del activo; la precisión no debe superar sus decimales.; pattern: `^[0-9]+(?:\.[0-9]+)?$` |
| `reference` | `string` | No | Tu referencia del pedido; no sustituye a Idempotency-Key.; maxLength: `120` |
| `address` | `string` | No | Dirección opcional del pool de pagos del proyecto. Si se omite, el servicio selecciona una. |
| `tolerance` | `string` | No | Pago insuficiente permitido en unidades del activo, estrictamente inferior a amount. Omítelo para una tolerancia cero.; pattern: `^[0-9]+(?:\.[0-9]+)?$` |
| `customer` | `object` | No |  |
| `product` | `object` | No |  |
| `payer` | `object` | No |  |
| `metadata` | `object` | No | Hasta 20 pares, máximo 8192 bytes JSON. No incluyas secretos. |
| `invoice_currency` | `string` | No | Moneda de tres letras de la cotización del pedido; solo junto con invoice_amount.; pattern: `^[A-Za-z]{3}$` |
| `invoice_amount` | `string` | No | Importe positivo del pedido en invoice_currency. Junto con chain y amount, es la instantánea del comerciante. Sin datos de pago, es el valor fijo de la factura que se utiliza para calcular el activo elegido por el pagador.; maxLength: `80`; pattern: `^[0-9]+(?:\.[0-9]+)?$` |
| `expires_in` | `integer` | No | Plazo de pago en minutos, a partir de la emisión correcta de los datos. Si se omite o se indica 0, se aplica la política del proyecto (60 de forma predeterminada); máximo 10080. Las solicitudes anteriores con método fijo también consideran los valores negativos como omitidos; el pago con elección de método rechaza los valores negativos.; Predeterminado: `60`; maximum: `10080` |

### `Error`

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `error` | `object` | Sí |  |
