Documentação completa para integrar seu sistema com a plataforma Garantify. Emita certificados de garantia digital, gerencie clientes e receba notificações em tempo real.
Autenticação
Inclua o header X-Garantify-API-Key em todas as requisições. Gerencie suas chaves no painel da Garantify Enterprise. Para sandbox, use uma chave grtf_test_. O endereço da API é o mesmo.
URL Base da API
http://localhost:5050Emitir, listar, consultar e cancelar certificados de garantia digital.
Emite um novo certificado de garantia digital. **Endpoint assíncrono** — retorna **202 Accepted** com `taskId` e o processamento real (validação de produto/cliente, persistência, envio de e-mail) ocorre em segundo plano. Inscreva-se no webhook `certificate.created` para ser notificado quando o certificado for emitido com sucesso, ou em `task.failed` para falhas.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| produtoId | string | Sim | ID do produto cadastrado |
| clienteId | string | Não | ID do cliente já cadastrado (opcional, usa dados do cliente) |
| consumidorNome | string | Não | Nome do consumidor. OBRIGATÓRIO quando clienteId não é informado. |
| consumidorEmail | string | Não | E-mail do consumidor. Opcional. Se informado, deve ser um endereço válido e será usado para enviar o certificado por e-mail (se habilitado). Sem e-mail, o certificado é criado normalmente mas sem envio automático. |
| consumidorTelefone | string | Não | Telefone do consumidor |
| garantiaMeses | number | Não | Duração da garantia em meses. Se omitido, usa o garantiaMeses cadastrado no produto. |
| observacao | string | Não | Observação livre |
| vendedorNome | string | Não | Nome do vendedor |
| vendedorEmail | string | Não | E-mail do vendedor |
| vendedorTelefone | string | Não | Telefone do vendedor |
| metadata | object | Não | Dados adicionais em formato chave-valor |
| dataEmissao | string (ISO 8601) | Não | Data de emissão do certificado em formato ISO 8601 (ex: "2026-03-21T00:00:00Z"). Opcional. Útil para backfill de vendas anteriores ou para alinhar a emissão com a data fiscal da venda. Se omitido, usa a data/hora atual (UTC). Limites: não pode estar no futuro nem antes de 10 anos atrás. |
{
"produtoId": "d5e6f7a8-9012-3cde-f456-7890abcdef01",
"clienteId": "c4d5e6f7-8901-2bcd-ef34-567890abcdef",
"garantiaMeses": 12,
"observacao": "Presente de aniversário",
"vendedorNome": "João Silva",
"vendedorEmail": "joao@joalheria.com",
"metadata": {
"lojaId": "loja-sp-01"
},
"dataEmissao": "2026-03-15T12:00:00Z"
}{
"taskId": "task_3fa85f645717456...",
"status": "Pending",
"criadoEm": "2026-03-21T12:00:00Z"
}{
"error": {
"code": "NOT_FOUND",
"message": "Produto não encontrado."
}
}curl -X POST "http://localhost:5050/api/v1/certificados" \
-H "X-Garantify-API-Key: SUA_API_KEY" \
-H "X-Garantify-Operador-Id: ID_DO_OPERADOR" \
-H "Content-Type: application/json" \
-d '{
"produtoId": "d5e6f7a8-9012-3cde-f456-7890abcdef01",
"clienteId": "c4d5e6f7-8901-2bcd-ef34-567890abcdef",
"garantiaMeses": 12,
"observacao": "Presente de aniversário",
"vendedorNome": "João Silva",
"vendedorEmail": "joao@joalheria.com",
"metadata": { "lojaId": "loja-sp-01" }
}'Emite múltiplos certificados de garantia em uma única chamada. Cada produto pode ter uma quantidade (cada unidade gera um certificado individual). Se o consumidor possui e-mail cadastrado, envia 1 e-mail consolidado; sem e-mail o lote é criado normalmente sem envio. Máximo de 200 itens por lote. **Endpoint assíncrono** — retorna **202 Accepted** com `taskId`. O processamento real ocorre em segundo plano. Webhooks disparados durante o processamento: um evento `certificate.created` para cada certificado emitido (se o lote gerar N certificados, serão N eventos individuais) + um evento consolidado `certificates.batch_created` com todos os certificados do lote. Em caso de falha do worker, é disparado o webhook `task.failed`. Integrações que escutam `certificate.created` recebem a mesma granularidade da emissão unitária.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| consumidorId | string | Sim | ID do consumidor (cliente) já cadastrado |
| produtos | array | Sim | Lista de produtos (mín: 1, máx: 200 itens) |
| produtos[].produtoId | string | Sim | ID do produto cadastrado |
| produtos[].quantidade | number | Não | Quantidade de unidades do produto (padrão: 1, máx: 100). Cada unidade gera um certificado individual. |
| produtos[].observacao | string | Não | Observação específica para os certificados deste produto |
| notaFiscal | string | Não | Número da nota fiscal (máx: 100 caracteres) |
| metadata | object | Não | Dados adicionais em formato chave-valor |
| vendedorNome | string | Não | Nome do vendedor (revendedor/representante) responsável pela venda. Aplicado a todos os certificados do lote. |
| vendedorEmail | string | Não | E-mail do vendedor (opcional, validado como endereço válido se fornecido). |
| vendedorTelefone | string | Não | Telefone do vendedor (formato livre, sem validação). |
| dataEmissao | string (ISO 8601) | Não | Data de emissão aplicada a todos os certificados do lote em formato ISO 8601 (ex: "2026-03-21T00:00:00Z"). Opcional. Útil para backfill de vendas anteriores ou para alinhar a emissão com a data fiscal da venda. Se omitido, usa a data/hora atual (UTC). Limites: não pode estar no futuro nem antes de 10 anos atrás. |
{
"consumidorId": "c4d5e6f7-8901-2bcd-ef34-567890abcdef",
"produtos": [
{
"produtoId": "d5e6f7a8-9012-3cde-f456-7890abcdef01",
"quantidade": 2,
"observacao": "Presente de aniversário"
},
{
"produtoId": "a1b2c3d4-5678-9abc-def0-123456789abc",
"quantidade": 1
},
{
"produtoId": "e5f6a7b8-9012-3cde-f456-abcdef012345",
"quantidade": 3,
"observacao": "Edição limitada"
}
],
"notaFiscal": "NF-001234",
"metadata": {
"lojaId": "loja-sp-01",
"vendedora": "Ana"
},
"vendedorNome": "Karla Franciane",
"vendedorEmail": "karla@loja.com.br",
"vendedorTelefone": "+5547999999999",
"dataEmissao": "2026-03-15T12:00:00Z"
}{
"taskId": "task_4fb96g756828567...",
"status": "Pending",
"criadoEm": "2026-03-21T12:00:00Z"
}{
"error": {
"code": "QUOTA_EXCEEDED",
"message": "Limite mensal de 500 certificados seria excedido. Atual: 498, solicitado: 3. Faça upgrade do plano."
}
}curl -X POST "http://localhost:5050/api/v1/certificados/lote" \
-H "X-Garantify-API-Key: SUA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"consumidorId": "c4d5e6f7-8901-2bcd-ef34-567890abcdef",
"produtos": [
{ "produtoId": "d5e6f7a8-9012-3cde-f456-7890abcdef01", "quantidade": 2, "observacao": "Presente de aniversário" },
{ "produtoId": "a1b2c3d4-5678-9abc-def0-123456789abc", "quantidade": 1 },
{ "produtoId": "e5f6a7b8-9012-3cde-f456-abcdef012345", "quantidade": 3, "observacao": "Edição limitada" }
],
"notaFiscal": "NF-001234",
"metadata": { "lojaId": "loja-sp-01", "vendedora": "Ana" }
}'Lista certificados com paginação por página (offset). Suporta filtros por status, busca textual e metadata.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| page | number | Não | Número da página, começando em 1 (padrão: 1) |
| pageSize | number | Não | Itens por página (padrão: 20, máx: 200) |
| status | string | Não | Filtrar por status: Ativa, Expirada, Cancelada |
| search | string | Não | Busca por código do certificado, nome do cliente, e-mail, produto ou marca |
| operadorId | string | Não | Filtrar certificados emitidos por um operador específico (UUID do operador) |
| metadata.* | string | Não | Filtrar por metadata (match exato). Vírgula = OR (metadata.vendedora=Karla,Joana). Não suporta operador "contém". |
{
"total": 142,
"page": 1,
"pageSize": 20,
"totalPages": 8,
"items": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"codigoCertificado": "GF-202603-A7K3M9",
"consumidorNome": "Carlos Souza",
"consumidorEmail": "carlos@email.com",
"produtoNome": "Anel Ouro 18k",
"marcaNome": "Vivara",
"emissorId": "d4e5f6a7-b8c9-4d0e-a1b2-c3d4e5f6a7b8",
"emissorNome": "João Silva",
"emissorTipo": "Operador",
"status": "Ativa",
"dataEmissao": "2026-03-21T00:00:00Z",
"dataExpiracao": "2027-03-21T00:00:00Z",
"metadata": {}
}
]
}curl -X GET "http://localhost:5050/api/v1/certificados?status=Ativa&search=Maria&metadata.vendedora=Karla&page=1&pageSize=20" \ -H "X-Garantify-API-Key: SUA_API_KEY"
Busca um certificado específico pelo seu ID (UUID).
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"codigoCertificado": "GF-202603-A7K3M9",
"clienteId": "c4d5e6f7-8901-2bcd-ef34-567890abcdef",
"clienteNome": "Carlos Souza",
"clienteEmail": "carlos@email.com",
"clienteTelefone": "11999887766",
"produtoId": "d5e6f7a8-9012-3cde-f456-7890abcdef01",
"produtoNome": "Anel Ouro 18k",
"produtoCodigo": "ANL-001",
"marcaNome": "Vivara",
"vendedorNome": "João Silva",
"vendedorEmail": "joao@joalheria.com",
"emissorId": "d4e5f6a7-b8c9-4d0e-a1b2-c3d4e5f6a7b8",
"emissorNome": "João Silva",
"emissorTipo": "Operador",
"status": "Ativa",
"statusEfetivo": "Ativa",
"observacao": "Presente de aniversário",
"dataEmissao": "2026-03-21T00:00:00Z",
"dataExpiracao": "2027-03-21T00:00:00Z",
"metadata": {
"lojaId": "loja-sp-01"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Certificado não encontrado."
}
}curl -X GET "http://localhost:5050/api/v1/certificados/3fa85f64-5717-4562-b3fc-2c963f66afa6" \ -H "X-Garantify-API-Key: SUA_API_KEY"
Busca um certificado pelo código de certificado (ex: GF-202603-A7K3M9).
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"codigoCertificado": "GF-202603-A7K3M9",
"clienteNome": "Carlos Souza",
"clienteEmail": "carlos@email.com",
"produtoNome": "Anel Ouro 18k",
"marcaNome": "Vivara",
"emissorId": "d4e5f6a7-b8c9-4d0e-a1b2-c3d4e5f6a7b8",
"emissorNome": "João Silva",
"emissorTipo": "Operador",
"status": "Ativa",
"statusEfetivo": "Ativa",
"dataEmissao": "2026-03-21T00:00:00Z",
"dataExpiracao": "2027-03-21T00:00:00Z",
"metadata": {}
}curl -X GET "http://localhost:5050/api/v1/certificados/codigo/GF-202603-A7K3M9" \ -H "X-Garantify-API-Key: SUA_API_KEY"
Cancela um certificado de garantia ativo. A operação é irreversível. **Endpoint assíncrono** — retorna **202 Accepted** com `taskId`. O cancelamento real ocorre em segundo plano. Inscreva-se no webhook `certificate.cancelled` para confirmação ou `task.failed` para falhas.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| motivo | string | Não | Motivo do cancelamento |
{
"motivo": "Produto devolvido pelo consumidor"
}{
"taskId": "task_5gc07h867939678...",
"status": "Pending",
"criadoEm": "2026-03-21T12:00:00Z"
}curl -X POST "http://localhost:5050/api/v1/certificados/3fa85f64-5717-4562-b3fc-2c963f66afa6/cancelar" \
-H "X-Garantify-API-Key: SUA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"motivo": "Produto devolvido pelo consumidor"
}'Cancela múltiplos certificados em uma única chamada (até 200 itens). Aceita IDs (UUID) ou códigos (ex: SBSRL-XXXXXXXXXX). Certificados já cancelados ou expirados são ignorados silenciosamente. A operação é irreversível para os certificados cancelados. **Endpoint assíncrono** — retorna **202 Accepted** com `taskId`. O processamento ocorre em segundo plano. Webhooks: um evento `certificate.cancelled` é despachado para cada certificado cancelado com sucesso. Em caso de falha do worker, é disparado `task.failed`.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| certificados | string[] | Sim | Lista de IDs (UUID) ou códigos de certificado a cancelar. Máximo 200 itens. Aceita mistura — cada item é detectado como UUID ou código. |
| motivo | string | Não | Motivo do cancelamento aplicado a todos os certificados do lote. |
{
"certificados": [
"3fa85f64-5717-4562-b3fc-2c963f66afa6",
"GF-202603-A7K3M9",
"GF-202603-B8L4N0"
],
"motivo": "Lote devolvido pelo varejo"
}{
"taskId": "task_6hd18i977a4078...",
"status": "Pending",
"criadoEm": "2026-03-21T12:00:00Z"
}curl -X POST "http://localhost:5050/api/v1/certificados/cancelar-lote" \
-H "X-Garantify-API-Key: SUA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"certificados": [
"3fa85f64-5717-4562-b3fc-2c963f66afa6",
"GF-202603-A7K3M9"
],
"motivo": "Lote devolvido pelo varejo"
}'Transfere um certificado de garantia para outro consumidor. É obrigatório informar pelo menos um identificador (email ou novoConsumidorId).
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| string | Não | E-mail do novo proprietário. Obrigatório se novoConsumidorId não for informado. | |
| novoConsumidorId | string | Não | ID do novo consumidor já cadastrado. Obrigatório se email não for informado. |
{
"email": "novo-proprietario@email.com"
}{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"codigoCertificado": "GF-202603-A7K3M9",
"status": "Ativa",
"transferidoPara": "a1b2c3d4-5678-9abc-def0-123456789abc"
}curl -X POST "http://localhost:5050/api/v1/certificados/3fa85f64-5717-4562-b3fc-2c963f66afa6/transferir" \
-H "X-Garantify-API-Key: SUA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "novo-proprietario@email.com"
}'Anexa uma nota fiscal a um certificado de garantia. A chave da nota fiscal deve ser obtida via upload de imagem.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| notaFiscalKey | string | Sim | Chave S3 da imagem da nota fiscal (obtida via POST /upload/imagem) |
{
"notaFiscalKey": "enterprise/b2c3d4e5/nota-fiscal.jpg"
}{
"message": "Nota fiscal atualizada com sucesso."
}curl -X PATCH "http://localhost:5050/api/v1/certificados/3fa85f64-5717-4562-b3fc-2c963f66afa6/nota-fiscal" \
-H "X-Garantify-API-Key: SUA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"notaFiscalKey": "enterprise/b2c3d4e5/nota-fiscal.jpg"
}'Remove a nota fiscal anexada a um certificado de garantia.
{
"message": "Nota fiscal removida com sucesso."
}curl -X DELETE "http://localhost:5050/api/v1/certificados/3fa85f64-5717-4562-b3fc-2c963f66afa6/nota-fiscal" \ -H "X-Garantify-API-Key: SUA_API_KEY"
Envia o e-mail do certificado de garantia para o consumidor associado.
{
"message": "E-mail do certificado enviado com sucesso.",
"enviado": true
}curl -X POST "http://localhost:5050/api/v1/certificados/3fa85f64-5717-4562-b3fc-2c963f66afa6/enviar-email" \ -H "X-Garantify-API-Key: SUA_API_KEY"