TURRON Developers Coleção Postman

API de Integração

Integre colaboradores e pedidos com a Turron

API REST segura para cadastrar e manter colaboradores e consultar o consumo registrado no PDV. Autenticação OAuth 2.0, respostas em JSON e limites claros para integrações em lote.

URL base http://127.0.0.1:6334
Segura por padrão

OAuth 2.0 client credentials, tokens RS256 de 15 minutos e escopos por rota.

Pronta para lote

Até 1000 colaboradores por requisição, com transação tudo ou nada.

Reenvio sem duplicar

Header Idempotency-Key em todas as operações de escrita.

Limites claros

120 req/min por cliente, paginação de até 100 itens.

Primeiros passos

Início rápido

Em três passos você faz a primeira chamada à API.

  1. 1

    Receba suas credenciais

    A equipe Turron envia um client_id e um client_secret exclusivos da sua empresa, com os escopos liberados para a sua integração. Guarde o secret em um cofre de segredos — ele não pode ser recuperado, apenas substituído.

  2. 2

    Gere um access token

    Troque as credenciais por um token válido por 15 minutos.

    POST /oauth/token
    curl -X POST "http://127.0.0.1:6334/oauth/token" \
      -u "$CLIENT_ID:$CLIENT_SECRET" \
      -d "grant_type=client_credentials"
  3. 3

    Chame a API

    Envie o token no header Authorization: Bearer.

    GET /v1/employees
    curl -X GET "http://127.0.0.1:6334/v1/employees?page=1&limit=50" \
      -H "Authorization: Bearer $ACCESS_TOKEN"

Segurança

Autenticação

A API usa o fluxo OAuth 2.0 Client Credentials (RFC 6749 §4.4), padrão de mercado para integração entre sistemas. O token é um JWT assinado com RS256 e deve ser enviado em todas as rotas /v1.

15 minValidade do token
BearerTipo do token
5 tentativasBloqueio após falhas (15 min)

Escopos

Cada credencial recebe apenas os escopos necessários. Chamar uma rota sem o escopo retorna 403.

EscopoPermite
employees:readConsultar colaboradores
employees:writeCadastrar e atualizar colaboradores
orders:readConsultar itens de pedidos

Ciclo de vida do token

  • Guarde o token em memória e reutilize-o até perto de expires_in.
  • Ao receber 401, gere um novo token e repita a requisição uma única vez.
  • Tokens podem ser revogados a qualquer momento pela Turron (troca de secret, desativação ou mudança de escopos).
  • O acesso pode ser restrito a IPs específicos. Informe à Turron os IPs de saída do seu servidor.
Nunca exponha o client_secret

Use as credenciais apenas no seu back-end. Não as coloque em aplicativos, páginas web, repositórios ou logs. Em caso de vazamento, solicite a rotação imediata.

Ferramentas

Coleção Postman

Baixe o pacote com todas as requisições prontas. O token é gerado e renovado automaticamente pela coleção — basta informar suas credenciais.

  1. Importe o arquivo no Postman em File → Import (ou arraste o arquivo para a janela).
  2. Abra a coleção "Turron · API de Integração" e vá até a aba Variables.
  3. Preencha clientId e clientSecret na coluna Current value e salve.
  4. Envie qualquer requisição — o token é obtido e renovado sozinho antes de expirar.

Prefere outra ferramenta? A especificação completa está disponível em OpenAPI 3 (JSON) e pode ser importada no Insomnia, Bruno, Swagger Editor ou geradores de SDK.

Endpoints

Autenticação

Troque suas credenciais por um access token de curta duração.

POST /oauth/token HTTP Basic

Gera um access token (OAuth 2.0 client credentials)

Envie client_id e client_secret via HTTP Basic (recomendado) ou no corpo. Aceita application/x-www-form-urlencoded ou application/json. O token expira em `expires_in` segundos.

  • Envie as credenciais via HTTP Basic (recomendado) ou no corpo como client_id e client_secret.
  • Aceita application/x-www-form-urlencoded (padrão OAuth) ou application/json.
  • Reutilize o token até expirar (expires_in, em segundos). Não gere um token por requisição.

Corpo (form-urlencoded)

grant_type string obrigatório

valores: client_credentials

scope string

Opcional. Escopos separados por espaço para um token com menos permissões.

Requisição
curl -X POST "http://127.0.0.1:6334/oauth/token" \
  -u "$CLIENT_ID:$CLIENT_SECRET" \
  -d "grant_type=client_credentials"
Resposta · 200
{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "Bearer",
  "expires_in": 900,
  "scope": "employees:read employees:write orders:read"
}

Endpoints

Colaboradores

Cadastro e manutenção dos colaboradores. A matrícula (registration) é a chave única do colaborador. Toda alteração é sincronizada automaticamente com os ambientes locais (PDV e catraca).

GET /v1/employees employees:read

Lista colaboradores (paginado)

Parâmetros de consulta

page integer

padrão: 1 · de 1 a 100000

limit integer

Itens por página (máx. 100)

padrão: 50 · de 1 a 100

registration string

até 15 caracteres

badge string

até 15 caracteres

name string

Busca parcial

até 100 caracteres

status string

valores: active, inactive

updatedSince date | date-time

Somente alterados a partir desta data

Requisição
curl -X GET "http://127.0.0.1:6334/v1/employees?page=1&limit=50&status=active" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
Resposta · 200
{
  "data": [
    {
      "registration": "1001",
      "badge": "50001",
      "name": "Maria da Silva",
      "company": "1",
      "profitCenter": "11931400",
      "integrationCode": null,
      "status": "active",
      "pendingSync": true,
      "integratedAt": null,
      "disabledAt": null,
      "createdAt": "2026-09-29T20:09:31.705Z",
      "updatedAt": "2026-09-29T20:09:31.705Z"
    }
  ],
  "meta": {
    "page": 1,
    "limit": 50,
    "total": 1,
    "totalPages": 1
  },
  "links": {
    "self": "/v1/employees?limit=50&status=active&page=1",
    "next": null,
    "prev": null
  }
}
GET /v1/employees/{registration} employees:read

Consulta um colaborador pela matrícula

Parâmetros de rota

registration string obrigatório

Matrícula do colaborador (chave única)

até 15 caracteres

Requisição
curl -X GET "http://127.0.0.1:6334/v1/employees/1001" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
Resposta · 200
{
  "data": {
    "registration": "1001",
    "badge": "50001",
    "name": "Maria da Silva",
    "company": "1",
    "profitCenter": "11931400",
    "integrationCode": null,
    "status": "active",
    "pendingSync": true,
    "integratedAt": null,
    "disabledAt": null,
    "createdAt": "2026-09-29T20:09:31.705Z",
    "updatedAt": "2026-09-29T20:09:31.705Z"
  }
}
POST /v1/employees employees:write Idempotente

Cadastra um colaborador

Corpo (JSON)

registration string obrigatório

Matrícula do colaborador (chave única)

até 15 caracteres

badge string obrigatório

Crachá

até 15 caracteres

name string obrigatório

até 250 caracteres

company string

até 20 caracteres

profitCenter string

até 30 caracteres

integrationCode string

até 20 caracteres

status string

valores: active, inactive

Requisição
curl -X POST "http://127.0.0.1:6334/v1/employees" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "registration": "1001",
  "badge": "50001",
  "name": "Maria da Silva",
  "company": "1",
  "profitCenter": "11931400",
  "status": "active"
}'
Resposta · 201
{
  "message": "Colaborador criado com sucesso. Será processada a integração com os ambientes locais.",
  "data": {
    "registration": "1001",
    "badge": "50001",
    "name": "Maria da Silva",
    "company": "1",
    "profitCenter": "11931400",
    "integrationCode": null,
    "status": "active",
    "pendingSync": true,
    "integratedAt": null,
    "disabledAt": null,
    "createdAt": "2026-09-29T20:09:31.705Z",
    "updatedAt": "2026-09-29T20:09:31.705Z"
  }
}
POST /v1/employees/bulk employees:write Idempotente

Cadastra até 1000 colaboradores (tudo ou nada)

  • Até 1000 colaboradores por requisição.
  • Tudo ou nada: se uma matrícula já existir ou estiver repetida no envio, nenhum registro é gravado e todas as pendências são listadas em errors.

Corpo (JSON)

items object[] obrigatório

1 a 1000 itens

items[].registration string obrigatório

Matrícula do colaborador (chave única)

até 15 caracteres

items[].badge string obrigatório

Crachá

até 15 caracteres

items[].name string obrigatório

até 250 caracteres

items[].company string

até 20 caracteres

items[].profitCenter string

até 30 caracteres

items[].integrationCode string

até 20 caracteres

items[].status string

valores: active, inactive

Requisição
curl -X POST "http://127.0.0.1:6334/v1/employees/bulk" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "items": [
    {
      "registration": "1001",
      "badge": "50001",
      "name": "Maria da Silva",
      "profitCenter": "11931400"
    },
    {
      "registration": "1002",
      "badge": "50002",
      "name": "João Souza",
      "profitCenter": "11931400"
    }
  ]
}'
Resposta · 201
{
  "message": "Colaboradores criados com sucesso. Será processada a integração com os ambientes locais.",
  "created": 2
}
PATCH /v1/employees/{registration} employees:write Idempotente

Atualiza um colaborador (somente os campos enviados)

  • Atualização parcial: apenas os campos enviados são alterados.
  • Para desligar um colaborador envie status: "inactive" — a data de desligamento é registrada automaticamente.

Parâmetros de rota

registration string obrigatório

Matrícula do colaborador (chave única)

até 15 caracteres

Corpo (JSON)

badge string

Crachá

até 15 caracteres

name string

até 250 caracteres

company string

até 20 caracteres

profitCenter string

até 30 caracteres

integrationCode string

até 20 caracteres

status string

valores: active, inactive

Requisição
curl -X PATCH "http://127.0.0.1:6334/v1/employees/1001" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "badge": "50099",
  "status": "inactive"
}'
Resposta · 200
{
  "message": "Colaborador atualizado com sucesso. Será processada a integração com os ambientes locais.",
  "data": {
    "registration": "1001",
    "badge": "50099",
    "name": "Maria da Silva",
    "company": "1",
    "profitCenter": "11931400",
    "integrationCode": null,
    "status": "inactive",
    "pendingSync": true,
    "integratedAt": null,
    "disabledAt": "2026-09-29T21:02:10.114Z",
    "createdAt": "2026-09-29T20:09:31.705Z",
    "updatedAt": "2026-09-29T20:09:31.705Z"
  }
}
PATCH /v1/employees/bulk employees:write Idempotente

Atualiza até 1000 colaboradores (tudo ou nada)

  • Até 1000 colaboradores por requisição, identificados pela matrícula.
  • Tudo ou nada: se alguma matrícula não existir, nada é alterado.
  • Registros sem alteração real são contados em unchanged e não geram nova sincronização.

Corpo (JSON)

items object[] obrigatório

1 a 1000 itens

items[].registration string obrigatório

Matrícula do colaborador (chave única)

até 15 caracteres

items[].badge string

Crachá

até 15 caracteres

items[].name string

até 250 caracteres

items[].company string

até 20 caracteres

items[].profitCenter string

até 30 caracteres

items[].integrationCode string

até 20 caracteres

items[].status string

valores: active, inactive

Requisição
curl -X PATCH "http://127.0.0.1:6334/v1/employees/bulk" \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "items": [
    {
      "registration": "1001",
      "status": "inactive"
    },
    {
      "registration": "1002",
      "name": "João Souza Lima",
      "badge": "50010"
    }
  ]
}'
Resposta · 200
{
  "message": "Colaboradores atualizados com sucesso. Será processada a integração com os ambientes locais.",
  "updated": 2,
  "unchanged": 0
}

Endpoints

Pedidos

Consumo dos colaboradores registrado no PDV, consultado por período.

GET /v1/order-items orders:read

Lista itens de pedidos por período (paginado)

Período obrigatório de no máximo 31 dias. Datas YYYY-MM-DD usam o fuso de Brasília e incluem o dia inteiro.

  • startDate e endDate são obrigatórios, com período máximo de 31 dias.
  • Datas no formato YYYY-MM-DD usam o fuso de Brasília (UTC-3) e incluem o dia inteiro. Também é aceito date-time ISO 8601.
  • Os itens são ordenados por data de emissão; percorra as páginas por links.next até ele ser null.

Parâmetros de consulta

page integer

padrão: 1 · de 1 a 100000

limit integer

Itens por página (máx. 100)

padrão: 50 · de 1 a 100

startDate date | date-time obrigatório
endDate date | date-time obrigatório
registration string

até 15 caracteres

badge string

até 15 caracteres

orderId integer

de 1 a 2147483647

Requisição
curl -X GET "http://127.0.0.1:6334/v1/order-items?startDate=2026-09-01&endDate=2026-09-30&page=1&limit=100" \
  -H "Authorization: Bearer $ACCESS_TOKEN"
Resposta · 200
{
  "data": [
    {
      "id": 1307,
      "orderId": 212896,
      "orderItemId": 348040,
      "issueDate": "2026-09-02T11:31:57.000Z",
      "cashierCode": "1",
      "cashierType": "Lanchonete",
      "registration": "1001",
      "badge": "50001",
      "employeeName": "Maria da Silva",
      "productCode": "81",
      "productDescription": "Esfiha de Calabresa",
      "quantity": 1,
      "unitValue": 6,
      "totalValue": 6,
      "orderTotalValue": 11
    }
  ],
  "meta": {
    "page": 1,
    "limit": 100,
    "total": 1,
    "totalPages": 1
  },
  "links": {
    "self": "/v1/order-items?startDate=2026-09-01&endDate=2026-09-30&limit=100&page=1",
    "next": null,
    "prev": null
  }
}

Endpoints

Sistema

Monitoramento da disponibilidade da API.

GET /health Público

Verifica se a API e o banco estão disponíveis

Esta rota não recebe parâmetros.

Requisição
curl -X GET "http://127.0.0.1:6334/health"
Resposta · 200
{
  "status": "ok"
}

Referência

Paginação

Todas as listagens são paginadas. Use page (a partir de 1) e limit (padrão 50, máximo 100). A resposta traz o total e os links da próxima página e da anterior, preservando os filtros.

Estrutura da resposta paginada
{
  "data": [
    "..."
  ],
  "meta": {
    "page": 2,
    "limit": 100,
    "total": 1095,
    "totalPages": 11
  },
  "links": {
    "self": "/v1/order-items?startDate=2026-09-01&endDate=2026-09-30&limit=100&page=2",
    "next": "/v1/order-items?startDate=2026-09-01&endDate=2026-09-30&limit=100&page=3",
    "prev": "/v1/order-items?startDate=2026-09-01&endDate=2026-09-30&limit=100&page=1"
  }
}

Para percorrer tudo, siga links.next até ele ser null.

Referência

Idempotência

Operações de escrita aceitam o header opcional Idempotency-Key (8 a 128 caracteres; recomendamos um UUID). Se a rede cair e você reenviar a mesma requisição com a mesma chave, a API devolve a resposta original sem processar de novo — e sinaliza com o header Idempotent-Replayed: true.

  • A chave vale por 24 horas e é exclusiva da sua credencial.
  • Reutilizar a chave com um corpo diferente retorna 422.
  • Se a requisição original falhar, a chave é liberada para uma nova tentativa.

Referência

Limites e rate limit

RecursoLimite
Requisições por credencial120 por minuto
Operações em lote (bulk)10 por minuto
Geração de token (/oauth/token)10 por minuto por IP
Itens por requisição em lote1000
Itens por página100
Período da consulta de pedidos31 dias
Tamanho do corpo da requisição2 MB

Toda resposta informa o consumo nos headers x-ratelimit-limit, x-ratelimit-remaining e x-ratelimit-reset. Ao exceder, a API retorna 429 com o header Retry-After (segundos).

Referência

Erros

Os erros seguem o padrão Problem Details (RFC 9457, application/problem+json). O campo errors detalha cada problema de validação, e o requestId identifica a requisição para o suporte (também enviado no header X-Request-Id).

Exemplo · 400
{
  "type": "about:blank",
  "title": "Requisição inválida",
  "status": 400,
  "detail": "Um ou mais campos são inválidos.",
  "instance": "/v1/employees",
  "requestId": "c1c4606b-c22d-4eb3-a56b-619576cc086a",
  "errors": [
    {
      "location": "body",
      "field": "registration",
      "message": "must have required property 'registration'"
    }
  ]
}
StatusSignificado
200 / 201Sucesso.
400Requisição inválida: campo ausente, formato incorreto, campo desconhecido ou limite excedido.
401Token ausente, inválido, expirado ou revogado. Gere um novo token.
403O token não tem o escopo exigido pela rota, ou o IP de origem não está autorizado.
404Recurso não encontrado (ex.: matrícula inexistente).
409Conflito: registro já existe ou requisição com a mesma Idempotency-Key ainda em processamento.
413Corpo da requisição maior que 2 MB.
422Não processável: itens repetidos no envio ou Idempotency-Key reutilizada com outro conteúdo.
429Limite de requisições atingido. Aguarde o tempo indicado no header Retry-After.
500Erro interno. Informe o requestId ao suporte.

O endpoint /oauth/token segue o formato de erro do OAuth 2.0: {"error": "invalid_client", "error_description": "..."}.

Referência

Boas práticas

  • Envie apenas os campos documentados, em inglês e com os tipos corretos — campos desconhecidos são rejeitados.
  • Prefira as rotas /bulk para cargas grandes, em blocos de até 1000 itens.
  • Use Idempotency-Key em toda escrita para poder reenviar com segurança.
  • Em 429 ou 5xx, aguarde e tente novamente com backoff exponencial.
  • Registre o requestId das respostas com erro — ele agiliza o atendimento.
  • Todas as chamadas são auditadas (credencial, rota, IP e horário).