docs

Autenticación

Descripción General

La API PIX Bacen utiliza exactamente el mismo sistema de autenticación que la API estándar de FyPay. No existe una ruta de token específica para el formato Bacen: el token se genera en POST https://api.fypay.me/api/auth/token y todas las solicitudes a los endpoints Bacen deben incluir ese token Bearer en el encabezado Authorization.

La autenticación es idéntica a la de la API estándar. Si ya tiene credenciales y certificado, puede usarlos directamente.

Obtención del Token

Endpoint

POST https://api.fypay.me/api/auth/token

Esta ruta exige mTLS: el certificado de cliente X.509 (PEM, RSA 2048, válido por 2 años, vinculado a su cuenta) y su clave privada se presentan en el handshake TLS, no en un encabezado HTTP. Los endpoints Bacen en sí no exigen certificado, solo el token Bearer.

Solicitud

curl -X POST https://api.fypay.me/api/auth/token \
  --cert client.crt \
  --key client.key \
  -H "Content-Type: application/json" \
  -d '{
    "clientId": "6967c0a0-3566-48d0-8c13-717038b52279",
    "clientSecret": "su-client-secret"
  }'
import fs from 'node:fs';
import { Agent, request } from 'undici';

const mtlsAgent = new Agent({
  connect: {
    cert: fs.readFileSync('./client.crt'),
    key: fs.readFileSync('./client.key'),
  },
});

const { body } = await request('https://api.fypay.me/api/auth/token', {
  method: 'POST',
  dispatcher: mtlsAgent,
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    clientId: process.env.FYPAY_CLIENT_ID,
    clientSecret: process.env.FYPAY_CLIENT_SECRET,
  }),
});

const { access_token, expires_in } = await body.json();
import os
import requests

response = requests.post(
    'https://api.fypay.me/api/auth/token',
    json={
        'clientId': os.environ['FYPAY_CLIENT_ID'],
        'clientSecret': os.environ['FYPAY_CLIENT_SECRET'],
    },
    cert=('client.crt', 'client.key'),
)

access_token = response.json()['access_token']

Respuesta (201 Created)

{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "Bearer",
  "expires_in": 600,
  "scope": "email profile"
}

Uso del Token

Incluya el token en todas las solicitudes de la API PIX Bacen:

curl -X PUT https://api.fypay.me/api/cob/7978c0c97ea847e78e8849634473c1f1 \
  -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -H "Content-Type: application/json" \
  -d '{...}'

Parámetros de Autenticación

stringobrigatorio

Identificador de la credencial, en formato UUID v4. Se genera en el Dashboard de FyPay, en Configuración → Credenciales.

stringobrigatorio

Secreto de la credencial. Se muestra una sola vez en el dashboard, en el momento de la generación.

Nunca exponga el clientSecret, el certificado ni la clave privada en código frontend o repositorios públicos.

Campos de la Respuesta

access_tokenstring

Token JWT para autenticar las solicitudes.

token_typestring

Tipo de token. Siempre "Bearer".

expires_innumber

Tiempo de vida del token en segundos. No asuma un valor fijo: use este campo para programar la renovación.

scopestring

Alcance del token.

Renovación del Token

El token expira después de expires_in segundos. Implemente renovación automática:

import fs from 'node:fs';
import { Agent, request } from 'undici';

class TokenManager {
  private token: string | null = null;
  private expiresAt = 0;
  private readonly agent = new Agent({
    connect: {
      cert: fs.readFileSync(process.env.FYPAY_CLIENT_CERT_PATH!),
      key: fs.readFileSync(process.env.FYPAY_CLIENT_KEY_PATH!),
    },
  });

  async getToken(): Promise<string> {
    const safetyMarginMs = 30_000;
    if (!this.token || Date.now() >= this.expiresAt - safetyMarginMs) {
      await this.refreshToken();
    }
    return this.token!;
  }

  private async refreshToken(): Promise<void> {
    const { body } = await request('https://api.fypay.me/api/auth/token', {
      method: 'POST',
      dispatcher: this.agent,
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        clientId: process.env.FYPAY_CLIENT_ID,
        clientSecret: process.env.FYPAY_CLIENT_SECRET,
      }),
    });

    const data = (await body.json()) as { access_token: string; expires_in: number };
    this.token = data.access_token;
    this.expiresAt = Date.now() + data.expires_in * 1000;
  }
}

Errores de Autenticación

CódigoDescripciónSolución
401Token no proporcionadoIncluya el encabezado Authorization: Bearer <token>
401Token inválidoVerifique que el token sea correcto y no haya expirado
401Token expiradoObtenga un nuevo token vía POST /api/auth/token
400/401/403Error de certificado o de credenciales en /api/auth/token (códigos PUB_*, como PUB_CERT_HEADER_MISSING, PUB_INVALID_CREDENTIALS y PUB_CERT_NOT_AUTHORIZED_FOR_ACCOUNT)Consulte la referencia de errores en la guía de autenticación estándar

Buenas Prácticas

Próximos Pasos

En esta página