Synapse
gRPC + REST + SPI Pipeline

Synapse API

Integracao completa com o protocolo SPI do BACEN, criptografia RSFN, processamento de mensagens ISO 20022 e pipeline de alta disponibilidade com Kafka.

Arquitetura

O Synapse opera como um pipeline de 3 estagios com dual-channel HA para comunicacao com o ICOM do BACEN:

EstagioRoleFuncao
1INBOUND_PULLFaz polling no ICOM (PRIMARY + SECONDARY), publica mensagens no Kafka
2WORKERConsome Kafka, parseia XML, extrai metadados, despacha para handlers por tipo
3OUTBOUND_SENDConsome fila outbound, envia ao ICOM via multipart/mixed com gzip

Base URL

REST:
  Sandbox:    https://sandbox.synapse.axon.com
  Production: https://synapse.axon.com

gRPC:
  Sandbox:    sandbox.synapse.axon.com:443
  Production: synapse.axon.com:443

REST Endpoints - Transformacao

POST
/v1/transform

Transformacao generica de mensagens ISO 20022

Requestjson
{
  "source_format": "pacs.008",
  "target_format": "pix_payment",
  "message": "<Document xmlns='urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08'>...</Document>",
  "options": {
    "validate": true,
    "enrich": true
  }
}
Responsejson
{
  "transformation_id": "tr_abc123",
  "source_format": "pacs.008",
  "target_format": "pix_payment",
  "result": {
    "end_to_end_id": "E12345678901234567890123456789012",
    "amount": 150.00,
    "currency": "BRL",
    "debtor": {
      "name": "JOAO SILVA",
      "document": "***.***.789-00"
    },
    "creditor": {
      "name": "EMPRESA ABC LTDA",
      "document": "**.***.567/0001-**"
    }
  },
  "created_at": "2026-02-07T10:30:00Z"
}
POST
/v1/transform/pacs008

Transforma pacs.008 para formato PIX Payment

POST
/v1/transform/pacs002

Transforma pacs.002 para formato PIX Status

POST
/v1/transform/pacs004

Transforma pacs.004 para formato PIX Return

GET
/v1/transformations

Lista todas as transformacoes suportadas

REST Endpoints - SPI Outbound

Requer ISPB

O endpoint de envio SPI requer que a variavel de ambiente ISPB esteja configurada com o ISPB da instituicao (8 digitos).
POST
/v1/spi/send

Constroi e enfileira mensagem SPI outbound

Suporta 9 tipos de mensagem: PACS008, PACS002, PACS004, PAIN013, PAIN014, CAMT029, CAMT054, CAMT055, ADMI002.

Request - pacs.008 (Transferencia PIX)json
{
  "message_type": "PACS008",
  "channel": "PRIMARY",
  "params": {
    "transactions": [{
      "amount": 15000,
      "debtor": {
        "ispb": "12345678",
        "name": "JOAO SILVA",
        "document": "12345678900",
        "account_num": "123456",
        "account_type": "CACC"
      },
      "creditor": {
        "ispb": "87654321",
        "name": "EMPRESA ABC LTDA",
        "document": "12345678000199",
        "account_num": "654321",
        "account_type": "CACC"
      },
      "purpose": "OTHR"
    }],
    "local_instrument": "DICT"
  }
}
Request - pacs.002 (Confirmacao)json
{
  "message_type": "PACS002",
  "params": {
    "original_end_to_end_id": "E12345678202601011200abcdefghijk",
    "status": "ACCC"
  }
}
Request - pacs.004 (Devolucao)json
{
  "message_type": "PACS004",
  "params": {
    "original_end_to_end_id": "E12345678202601011200abcdefghijk",
    "amount": 15000,
    "return_reason": "MD06"
  }
}
Response (202)json
{
  "id": "msg_abc123",
  "biz_msg_idr": "M12345678abcdefghijklmnopqrstuvw",
  "message_type": "PACS008",
  "status": "queued"
}
GET
/v1/catalog/in

Catalogo de mensagens inbound (proxy BACEN ICOM)

GET
/v1/catalog/out

Catalogo de mensagens outbound (proxy BACEN ICOM)

REST Endpoints - Consulta de Mensagens

Requer DATABASE_DSN

Estes endpoints requerem que a variavel de ambiente DATABASE_DSN esteja configurada. Retornam 501 quando o banco de dados nao esta configurado.
GET
/v1/messages

Lista mensagens com filtros

Query parameters:

ParametroTipoDescricao
typestringTipo da mensagem (ex: pacs.008, camt.054)
directionstringDirecao (INBOUND, OUTBOUND)
statusstringStatus da mensagem
source_ispbstringISPB de origem (8 digitos)
destination_ispbstringISPB de destino (8 digitos)
limitintMaximo de resultados (default: 50)
offsetintOffset para paginacao (default: 0)
Responsejson
{
  "messages": [
    {
      "id": "msg_abc123",
      "type": "pacs.008",
      "direction": "INBOUND",
      "status": "PROCESSED",
      "source_ispb": "12345678",
      "destination_ispb": "87654321",
      "end_to_end_id": "E12345678901234567890123456789012",
      "created_at": "2026-02-07T10:30:00Z"
    }
  ],
  "total": 1
}
GET
/v1/messages/{id}

Busca mensagem por ID

GET
/v1/messages/e2e/{endToEndId}

Busca mensagens por EndToEndId

REST Endpoints - Webhooks

Requer DATABASE_DSN

Estes endpoints requerem que a variavel de ambiente DATABASE_DSN esteja configurada. Retornam 501 quando o banco de dados nao esta configurado.
POST
/v1/webhooks

Cria configuracao de webhook

Requestjson
{
  "url": "https://sua-api.com/webhooks/synapse",
  "secret": "whsec_abc123",
  "events": ["pacs.008", "pacs.002", "camt.054"],
  "active": true
}
Response (201)json
{
  "id": "wh_abc123",
  "url": "https://sua-api.com/webhooks/synapse",
  "events": ["pacs.008", "pacs.002", "camt.054"],
  "active": true,
  "created_at": "2026-02-07T10:30:00Z"
}
GET
/v1/webhooks

Lista todos os webhooks configurados

GET
/v1/webhooks/{id}

Busca webhook por ID

DELETE
/v1/webhooks/{id}

Remove webhook

REST Endpoints - Operacional

GET
/health

Health check do servico (inclui status do banco se configurado)

Responsejson
{
  "status": "ok",
  "version": "2.0.0",
  "database": "ok"
}

Quando o banco esta configurado mas indisponivel, retorna status degraded.

GET
/ready

Readiness check - retorna 503 se banco configurado mas offline

GET
/metrics

Metricas Prometheus (quando METRICS_ENABLED=true)

gRPC Service

Para alta performance, utilize o servico gRPC:

synapse.v1.protoprotobuf
syntax = "proto3";

package synapse.v1;

service TransformationService {
  // Transforma uma mensagem ISO 20022
  rpc Transform(TransformRequest) returns (TransformResponse);

  // Stream de transformacoes em lote
  rpc TransformStream(stream TransformRequest) returns (stream TransformResponse);

  // Lista transformacoes suportadas
  rpc ListTransformations(ListTransformationsRequest) returns (ListTransformationsResponse);
}

message TransformRequest {
  string source_format = 1;
  string target_format = 2;
  bytes message = 3;
  TransformOptions options = 4;
}

message TransformResponse {
  string transformation_id = 1;
  bytes result = 2;
  TransformationStatus status = 3;
}

enum TransformationStatus {
  SUCCESS = 0;
  VALIDATION_ERROR = 1;
  PARSE_ERROR = 2;
  UNSUPPORTED_FORMAT = 3;
}

Performance

Para workloads de alta performance (mais de 1000 transformacoes/segundo), recomendamos usar a interface gRPC com streaming.

Mensagens SPI Suportadas (27 tipos)

O Synapse suporta todos os 27 tipos de mensagem do protocolo SPI do BACEN, com 4 revisoes (5.08.1, 5.09.2, 5.10.1, 5.11.1):

CategoriaTipoDescricao
PACSpacs.008FI to FI Customer Credit Transfer
pacs.002Payment Status Report
pacs.004Payment Return
PAINpain.009Mandate Initiation Request
pain.011Mandate Cancellation Request
pain.012Mandate Acceptance Report
pain.013Creditor Payment Activation Request
pain.014Creditor Payment Activation Status Report
CAMTcamt.014Return Account
camt.025Receipt
camt.029Resolution of Investigation
camt.052Bank to Customer Account Report
camt.053Bank to Customer Statement
camt.054Bank to Customer Debit/Credit Notification
camt.055Customer Payment Cancellation Request
camt.060Account Reporting Request
ADMIadmi.002System Event Notification
admi.004System Event Acknowledgement
PIBRpibr.001PIX Change Management
pibr.002PIX Change Management Status
REDAreda.014/016/017/022/031/041Reference Data Management
TRCKtrck.002Status Investigation

Seguranca

mTLS (ICP-Brasil)

Comunicacao com o BACEN via certificados ICP-Brasil. Suporta carregamento de certificados PEM via arquivo ou base64 em variaveis de ambiente.

Criptografia RSFN

Assinatura digital e criptografia conforme especificacao da Rede do SFN: RSA 2048 (PKCS#1 v1.5) para assinatura + AES-256-GCM para criptografia simetrica. Header de seguranca de 588 bytes (campos C01-C15).

Assinatura XMLDSig Nativa

Assinatura digital RSA-SHA256 in-process para mensagens SPI outbound, sem dependencia de servico externo. Utiliza Exclusive C14N com 3 referencias (KeyInfo, AppHdr, Document) e X509IssuerSerial. Configure via SPI_SIGN_CERT_PATH e SPI_SIGN_KEY_PATH. Prioridade: NativeSigner (cert/key) > ExternalSigner (URL) > NoOpSigner.

Validacao Inbound

Mensagens recebidas do BACEN sao validadas automaticamente (ISPB, BizMsgIdr, EndToEndId, CreDt, MsgDefIdr) com validadores especificos por tipo de mensagem. A validacao e advisory: registra warnings no log mas nunca rejeita mensagens, pois o BACEN e autoritativo.

Certificados ICP-Brasil

Para ambientes de producao, voce precisa de certificados ICP-Brasil validos emitidos por uma Autoridade Certificadora credenciada. O ambiente sandbox aceita certificados de teste.

Capacidades Adicionais

XSD Validation

Parsing de schemas XSD do catalogo SPI BACEN (26 tipos, 4 revisoes v5.08-v5.11), geracao de structs Go, e validacao runtime de XML contra schemas. Validacao de elementos obrigatorios, cardinalidade, restricoes de tipo simples (pattern, length, enum).

Certificate Management

Gerenciamento de certificados ICP-Brasil: decode PFX/PKCS#12 para PEM, store indexado por ISPB + tipo (PIA/PIC/SPB/MES/QRC) + versao, geracao de K8s secrets, e metricas Prometheus de expiracao (synapse_cert_days_until_expiry, synapse_cert_expired).

EMV QR Code (BR Code / PIX)

Geracao e parsing de QR codes PIX conforme especificacao EMV do BACEN. Suporta QR estatico (chave PIX, valor fixo) e dinamico (payload URL, txid). Validacao CRC16-CCITT e parsing TLV completo.

JOSE (JWS / JWE)

Assinatura digital JWS com algoritmos RSA (RS256/384/512, PS256) e ECDSA (ES256/384). Criptografia JWE com RSA-OAEP e RSA-OAEP-256 + AES-128-GCM e AES-256-GCM. Utilizado para comunicacao segura em endpoints de QR code dinamico e APIs PIX.

RFC 7807 Problem Details

Respostas de erro padronizadas conforme RFC 7807. Tipos pre-definidos para erros comuns: bad_request, not_found, validation_failed, message_rejected, schema_violation, certificate_expired, entre outros. Extensivel com campos adicionais.

Trace Propagation via Kafka

Propagacao automatica de contexto OpenTelemetry atraves de headers Kafka. Permite tracing distribuido end-to-end: HTTP request → Kafka producer → Kafka consumer → worker processing. Utiliza W3C TraceContext propagator.

Observabilidade

Metricas Prometheus

Disponivel em GET /metrics quando METRICS_ENABLED=true (default).

MetricaTipoLabelsDescricao
http_request_duration_secondsHistogrammethod, path, statusLatencia de requisicoes HTTP
http_requests_totalCountermethod, path, statusTotal de requisicoes HTTP
synapse_messages_processed_totalCountertype, direction, statusTotal de mensagens processadas
synapse_transformations_totalCountersource_type, target_format, statusTotal de transformacoes
synapse_webhook_deliveries_totalCounterevent_type, statusTotal de entregas de webhook
synapse_db_connections_activeGauge-Conexoes ativas no banco
synapse_cert_days_until_expiryGaugeispb, type, versionDias ate expiracao do certificado
synapse_cert_expiredGaugeispb, type, versionCertificado expirado (1=sim, 0=nao)
synapse_cert_totalGauge-Total de certificados no store

Tracing Distribuido

OpenTelemetry com exportador OTLP gRPC. Configure OTEL_EXPORTER_OTLP_ENDPOINT para habilitar (compativel com Jaeger, Tempo, Datadog). Quando nao configurado, utiliza tracer noop sem impacto em performance.

Kafka Topics

TopicDescricao
spi.inbound.primaryMensagens recebidas do canal primario
spi.inbound.secondaryMensagens recebidas do canal secundario
spi.outboundMensagens a serem enviadas ao ICOM
webhook.eventsEventos para entrega via webhook
dlqDead Letter Queue para mensagens com erro

Variaveis de Ambiente

VariavelDefaultDescricao
Servidor
HTTP_ADDR:8080Endereco do servidor HTTP
GRPC_ADDR:9090Endereco do servidor gRPC
ISPB-ISPB da instituicao (8 digitos)
Banco de Dados
DATABASE_DSN-Connection string PostgreSQL
SPI
SPI_PRIMARY_URL-URL do ICOM canal primario
SPI_SECONDARY_URL-URL do ICOM canal secundario
SPI_ROLES-Roles do pipeline (INBOUND_PULL,WORKER,OUTBOUND_SEND)
SPI_SYNC_ENABLEDfalseHabilita fast-path sincrono para pacs.008
SPI_SIGNATURE_SERVICE_URL-URL do servico de assinatura XMLDSig
SPI_SIGN_ENABLEDfalseHabilita assinatura digital XMLDSig no pipeline outbound
SPI_SIGN_CERT_PATH-Certificado X.509 para assinatura nativa XMLDSig (PEM)
SPI_SIGN_KEY_PATH-Chave privada RSA para assinatura nativa XMLDSig (PEM)
mTLS
CERT_PATH-Certificado mTLS ICP-Brasil (PEM)
KEY_PATH-Chave privada mTLS (PEM)
CA_PATH-CA bundle (PEM)
RSFN
RSFN_PRIVATE_KEY_PATH-Chave privada RSA para RSFN
RSFN_PUBLIC_KEY_PATH-Chave publica RSA do BACEN para RSFN
Kafka
KAFKA_BROKERS-Enderecos dos brokers Kafka
Webhook
WEBHOOK_SECRET-Secret para assinatura HMAC-SHA256 de webhooks
Observabilidade
LOG_LEVELinfoNivel de log (debug, info, warn, error)
METRICS_ENABLEDtrueHabilita metricas Prometheus no endpoint /metrics
OTEL_EXPORTER_OTLP_ENDPOINT-Endereco do coletor OpenTelemetry (ex: localhost:4317)
OTEL_SERVICE_NAMEaxon-synapseNome do servico para tracing
OTEL_SERVICE_VERSION0.1.0Versao do servico para tracing

Exemplo de uso - Go

main.gogo
package main

import (
    "context"
    "log"

    synapsev1 "github.com/axon-fintech/synapse-go/v1"
    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"
)

func main() {
    creds := credentials.NewClientTLSFromCert(nil, "")
    conn, err := grpc.Dial("synapse.axon.com:443",
        grpc.WithTransportCredentials(creds),
        grpc.WithPerRPCCredentials(apiKeyAuth{"your-api-key"}),
    )
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    client := synapsev1.NewTransformationServiceClient(conn)

    resp, err := client.Transform(context.Background(), &synapsev1.TransformRequest{
        SourceFormat: "pacs.008",
        TargetFormat: "pix_payment",
        Message:      []byte(pacs008XML),
    })
    if err != nil {
        log.Fatal(err)
    }

    log.Printf("Transformation ID: %s", resp.TransformationId)
}