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:
| Estagio | Role | Funcao |
|---|---|---|
| 1 | INBOUND_PULL | Faz polling no ICOM (PRIMARY + SECONDARY), publica mensagens no Kafka |
| 2 | WORKER | Consome Kafka, parseia XML, extrai metadados, despacha para handlers por tipo |
| 3 | OUTBOUND_SEND | Consome 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:443REST Endpoints - Transformacao
/v1/transformTransformacao generica de mensagens ISO 20022
{
"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
}
}{
"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"
}/v1/transform/pacs008Transforma pacs.008 para formato PIX Payment
/v1/transform/pacs002Transforma pacs.002 para formato PIX Status
/v1/transform/pacs004Transforma pacs.004 para formato PIX Return
/v1/transformationsLista todas as transformacoes suportadas
REST Endpoints - SPI Outbound
Requer ISPB
/v1/spi/sendConstroi e enfileira mensagem SPI outbound
Suporta 9 tipos de mensagem: PACS008, PACS002, PACS004, PAIN013, PAIN014, CAMT029, CAMT054, CAMT055, ADMI002.
{
"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"
}
}{
"message_type": "PACS002",
"params": {
"original_end_to_end_id": "E12345678202601011200abcdefghijk",
"status": "ACCC"
}
}{
"message_type": "PACS004",
"params": {
"original_end_to_end_id": "E12345678202601011200abcdefghijk",
"amount": 15000,
"return_reason": "MD06"
}
}{
"id": "msg_abc123",
"biz_msg_idr": "M12345678abcdefghijklmnopqrstuvw",
"message_type": "PACS008",
"status": "queued"
}/v1/catalog/inCatalogo de mensagens inbound (proxy BACEN ICOM)
/v1/catalog/outCatalogo de mensagens outbound (proxy BACEN ICOM)
REST Endpoints - Consulta de Mensagens
Requer DATABASE_DSN
/v1/messagesLista mensagens com filtros
Query parameters:
| Parametro | Tipo | Descricao |
|---|---|---|
| type | string | Tipo da mensagem (ex: pacs.008, camt.054) |
| direction | string | Direcao (INBOUND, OUTBOUND) |
| status | string | Status da mensagem |
| source_ispb | string | ISPB de origem (8 digitos) |
| destination_ispb | string | ISPB de destino (8 digitos) |
| limit | int | Maximo de resultados (default: 50) |
| offset | int | Offset para paginacao (default: 0) |
{
"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
}/v1/messages/{id}Busca mensagem por ID
/v1/messages/e2e/{endToEndId}Busca mensagens por EndToEndId
REST Endpoints - Webhooks
Requer DATABASE_DSN
/v1/webhooksCria configuracao de webhook
{
"url": "https://sua-api.com/webhooks/synapse",
"secret": "whsec_abc123",
"events": ["pacs.008", "pacs.002", "camt.054"],
"active": true
}{
"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"
}/v1/webhooksLista todos os webhooks configurados
/v1/webhooks/{id}Busca webhook por ID
/v1/webhooks/{id}Remove webhook
REST Endpoints - Operacional
/healthHealth check do servico (inclui status do banco se configurado)
{
"status": "ok",
"version": "2.0.0",
"database": "ok"
}Quando o banco esta configurado mas indisponivel, retorna status degraded.
/readyReadiness check - retorna 503 se banco configurado mas offline
/metricsMetricas Prometheus (quando METRICS_ENABLED=true)
gRPC Service
Para alta performance, utilize o servico gRPC:
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
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):
| Categoria | Tipo | Descricao |
|---|---|---|
| PACS | pacs.008 | FI to FI Customer Credit Transfer |
| pacs.002 | Payment Status Report | |
| pacs.004 | Payment Return | |
| PAIN | pain.009 | Mandate Initiation Request |
| pain.011 | Mandate Cancellation Request | |
| pain.012 | Mandate Acceptance Report | |
| pain.013 | Creditor Payment Activation Request | |
| pain.014 | Creditor Payment Activation Status Report | |
| CAMT | camt.014 | Return Account |
| camt.025 | Receipt | |
| camt.029 | Resolution of Investigation | |
| camt.052 | Bank to Customer Account Report | |
| camt.053 | Bank to Customer Statement | |
| camt.054 | Bank to Customer Debit/Credit Notification | |
| camt.055 | Customer Payment Cancellation Request | |
| camt.060 | Account Reporting Request | |
| ADMI | admi.002 | System Event Notification |
| admi.004 | System Event Acknowledgement | |
| PIBR | pibr.001 | PIX Change Management |
| pibr.002 | PIX Change Management Status | |
| REDA | reda.014/016/017/022/031/041 | Reference Data Management |
| TRCK | trck.002 | Status 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
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).
| Metrica | Tipo | Labels | Descricao |
|---|---|---|---|
| http_request_duration_seconds | Histogram | method, path, status | Latencia de requisicoes HTTP |
| http_requests_total | Counter | method, path, status | Total de requisicoes HTTP |
| synapse_messages_processed_total | Counter | type, direction, status | Total de mensagens processadas |
| synapse_transformations_total | Counter | source_type, target_format, status | Total de transformacoes |
| synapse_webhook_deliveries_total | Counter | event_type, status | Total de entregas de webhook |
| synapse_db_connections_active | Gauge | - | Conexoes ativas no banco |
| synapse_cert_days_until_expiry | Gauge | ispb, type, version | Dias ate expiracao do certificado |
| synapse_cert_expired | Gauge | ispb, type, version | Certificado expirado (1=sim, 0=nao) |
| synapse_cert_total | Gauge | - | 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
| Topic | Descricao |
|---|---|
| spi.inbound.primary | Mensagens recebidas do canal primario |
| spi.inbound.secondary | Mensagens recebidas do canal secundario |
| spi.outbound | Mensagens a serem enviadas ao ICOM |
| webhook.events | Eventos para entrega via webhook |
| dlq | Dead Letter Queue para mensagens com erro |
Variaveis de Ambiente
| Variavel | Default | Descricao |
|---|---|---|
| Servidor | ||
| HTTP_ADDR | :8080 | Endereco do servidor HTTP |
| GRPC_ADDR | :9090 | Endereco 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_ENABLED | false | Habilita fast-path sincrono para pacs.008 |
| SPI_SIGNATURE_SERVICE_URL | - | URL do servico de assinatura XMLDSig |
| SPI_SIGN_ENABLED | false | Habilita 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_LEVEL | info | Nivel de log (debug, info, warn, error) |
| METRICS_ENABLED | true | Habilita metricas Prometheus no endpoint /metrics |
| OTEL_EXPORTER_OTLP_ENDPOINT | - | Endereco do coletor OpenTelemetry (ex: localhost:4317) |
| OTEL_SERVICE_NAME | axon-synapse | Nome do servico para tracing |
| OTEL_SERVICE_VERSION | 0.1.0 | Versao do servico para tracing |
Exemplo de uso - Go
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)
}