FITALAPI

Crear una dirección de depósito

POST /v1/deposit-addresses

Crea una dirección de depósito para una red y un token. Exige Idempotency-Key y firma. 201 si quedó activa; 202 si aún no se confirma: repite con la misma clave.

DatoValor
Método y rutaPOST /v1/deposit-addresses
Servidorhttps://widget.fital.xyz
operationIdcreateDepositAddress
AccesoLlave con el scope deposit_addresses:write
Firma de peticiónObligatoria en producción y en la cuenta de prueba. El simulador público no la valida. Ver Firma de petición
IdempotenciaObligatoria, con Idempotency-Key. Ver Idempotencia
  • 202 significa que el alta aún no se confirma: address llega en null. No la compartas. Repite con la misma clave, o consulta el id.

Encabezados de la petición

EncabezadoObligatorioDescripción
AuthorizationSíBearer y tu llave.
Content-TypeSíapplication/json.
Idempotency-KeySíClave única de esta operación, de 8 a 200 caracteres. Repetirla con el mismo cuerpo devuelve la misma respuesta durante 7 días. Con otro cuerpo da 422 idempotency_key_reused, también pasado ese plazo.
X-Fital-TimestampSíHora Unix en segundos. Se acepta hasta 300 s de diferencia.
X-Fital-SignatureSíFirma v1= de la petición con el secreto de firma de la llave.
X-Fital-ScenarioNoSólo simuladores: elige la respuesta que quieres practicar.

Cuerpo

CampoTipoObligatorioDescripción
chaintextoSíRed de la dirección, por ejemplo polygon. No distingue mayúsculas. Hasta 30 caracteres.
currencytextoSíToken que recibirá, por ejemplo USDC. No distingue mayúsculas. Hasta 10 caracteres.
{
  "chain": "polygon",
  "currency": "USDC"
}

Respuestas correctas

201 Creado

CampoTipoObligatorioDescripción
addresstexto o nullSíDirección donde depositar. null mientras esté en processing.
chaintexto o nullSíRed de la dirección, en minúsculas.
created_attexto o nullSíFecha de creación. ISO 8601 en UTC.
currencytexto o nullSíToken que acepta, en mayúsculas.
idtextoSíIdentificador de la dirección, con prefijo dep_.
statustextoSíEstado de la dirección. processing: El alta aún no se confirma y los demás campos llegan en null. active: Ya recibe depósitos.
warningtexto o nullSíAdvertencia de uso. Muéstrala a quien vaya a depositar: dice también si en esa red un depósito rechazado no regresa automáticamente.

Valores de status

ValorSignificado
processingEl alta aún no se confirma y los demás campos llegan en null.
activeYa recibe depósitos.
{
  "address": "0x0000000000000000000000000000000000000000",
  "chain": "polygon",
  "created_at": "2026-11-04T18:00:00.000Z",
  "currency": "USDC",
  "id": "dep_9vLsK3mNc7QxB1tZ5hYdR2fP",
  "status": "active",
  "warning": "Envía sólo USDC por la red polygon. Otro token u otra red puede no acreditarse."
}

202 Aceptado: el resultado final llega después

Misma forma que la respuesta anterior.

{
  "address": null,
  "chain": null,
  "created_at": null,
  "currency": null,
  "id": "dep_9vLsK3mNc7QxB1tZ5hYdR2fP",
  "status": "processing",
  "warning": null
}

Encabezados de la respuesta

EncabezadoContenido
X-Request-IdIdentificador de la petición. Cítalo con soporte.
Idempotent-Replayedtrue si la respuesta repite una anterior con esa clave.
LocationRuta del recurso, con 201 y 202.
Retry-AfterSegundos a esperar, con 429, con 409 idempotency_in_progress y a veces con 503.

Errores

Todos usan la forma de Errores: error.code, message, request_id, details, retryable y docs_url. Decide por code.

HTTPCódigoCuándo saleretryable
400invalid_requestAlgún parámetro o campo no cumple el esquema. Mira details.fields.false
400idempotency_key_requiredFalta Idempotency-Key.false
400idempotency_key_invalidLa clave no mide entre 8 y 200 caracteres, o viene duplicada.false
401invalid_api_keyLa llave falta, está mal formada, venció o fue revocada, o la empresa está suspendida.false
401wrong_environmentLa llave es de otro ambiente.false
401invalid_signatureFalta la firma, no coincide o tiene más de 5 minutos.false
403account_restrictedLa cuenta tiene una restricción.false
403forbidden_scopeLa llave no tiene el scope de esta operación. details.required_scope lo nombra.false
403ip_not_allowedLa IP de origen no está activa en la lista de esa llave.false
403kyb_requiredLa empresa no tiene KYB aprobado o aún no está inscrita.false
403account_not_activeLa cuenta no está activa.false
409idempotency_in_progressUna petición anterior con esa clave sigue en curso. Llega con Retry-After.true
413invalid_requestEl cuerpo supera 64 KB.false
422in_reviewUna revisión de tu cuenta frena la operación.true
422pair_not_supportedEsa combinación de chain y currency no está disponible. Ver Cobertura.false
422deposit_address_rejectedLa dirección se rechazó.false
422idempotency_key_reusedUsaste esa clave con otro cuerpo, también pasados 7 días.false
429rate_limitedSuperaste un límite de peticiones. Llega con Retry-After.true
500internal_errorFallo nuestro. El resultado de la petición no se conoce.true
503service_unavailableEl servicio no está disponible por ahora. El resultado de la petición no se conoce.true

Ejemplos de error

400 invalid_request:

{
  "error": {
    "code": "invalid_request",
    "message": "Petición inválida",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {
      "fields": {
        "chain": "Valor inválido"
      }
    },
    "retryable": false,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#invalid_request"
  }
}

401 invalid_api_key:

{
  "error": {
    "code": "invalid_api_key",
    "message": "Credencial inválida",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {},
    "retryable": false,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#invalid_api_key"
  }
}

403 account_restricted:

{
  "error": {
    "code": "account_restricted",
    "message": "Tu cuenta tiene una restricción. Contacta a tu ejecutivo FITAL.",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {},
    "retryable": false,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#account_restricted"
  }
}

409 idempotency_in_progress:

{
  "error": {
    "code": "idempotency_in_progress",
    "message": "Operación en curso",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {},
    "retryable": true,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#idempotency_in_progress"
  }
}

413 invalid_request:

{
  "error": {
    "code": "invalid_request",
    "message": "Petición inválida",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {},
    "retryable": false,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#invalid_request"
  }
}

422 in_review:

{
  "error": {
    "code": "in_review",
    "message": "La operación está en revisión",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {},
    "retryable": true,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#in_review"
  }
}

429 rate_limited:

{
  "error": {
    "code": "rate_limited",
    "message": "Demasiadas peticiones",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {},
    "retryable": true,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#rate_limited"
  }
}

500 internal_error:

{
  "error": {
    "code": "internal_error",
    "message": "Error interno",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {},
    "retryable": true,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#internal_error"
  }
}

503 service_unavailable:

{
  "error": {
    "code": "service_unavailable",
    "message": "Servicio no disponible",
    "request_id": "0123456789abcdef0123456789abcdef",
    "details": {},
    "retryable": true,
    "docs_url": "https://merchants.fital.xyz/docs/errores/#service_unavailable"
  }
}

Reintentos

Ante un timeout o una conexión cortada, repite con la misma clave.

  • 409 idempotency_in_progress: Espera Retry-After y repite con la misma clave.
  • 422 in_review: Mira retryable. Con true, repite con la misma clave cuando la revisión se levante. Con false, el rechazo quedó registrado y esa clave lo repite: usa una clave nueva tras la revisión.
  • 429 rate_limited: Espera lo que indique Retry-After y repite.
  • 500 internal_error: Repite con espera exponencial.
  • 503 service_unavailable: Repite con espera exponencial. Respeta Retry-After si viene.

Ver Reintentos y Límites.

Muestras

Variables de estas muestras: simulador público, sin cuenta

Define esto en tu terminal. Con estos valores las muestras corren tal cual contra el simulador público:

export FITAL_API="https://widget.fital.xyz/explorar/v1"
export FITAL_KEY="sk_test_sandbox_publica"
export FITAL_SIGNING_SECRET="secreto_de_firma_de_prueba_publico"

En la cuenta de prueba o en producción cambia la base, la llave y el secreto, y sustituye los id de ejemplo por los tuyos. Ver Ambientes.

op-crear-direccion-de-deposito.sh
CUERPO='{"chain":"polygon","currency":"USDC"}'
CLAVE="ejemplo-crear-direccion-de-deposito"
TS=$(date +%s)
HASH=$(printf '%s' "$CUERPO" | openssl dgst -sha256 -r | cut -d' ' -f1)
FIRMA=$(printf '%s\n%s\n%s\n%s\n%s' "$TS" POST /v1/deposit-addresses "$HASH" "$CLAVE" \
  | openssl dgst -sha256 -hmac "$FITAL_SIGNING_SECRET" -r | cut -d' ' -f1)
curl -sS -X POST "$FITAL_API/deposit-addresses" \
  -H "Authorization: Bearer $FITAL_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $CLAVE" \
  -H "X-Fital-Timestamp: $TS" \
  -H "X-Fital-Signature: v1=$FIRMA" \
  -d "$CUERPO"

Guías

Ver esta página en Markdown

En esta página