Pular para o conteúdo

Fornecedores (suppliers)

O recurso suppliers expõe os fornecedores cadastrados na sua conta: razão social, nome fantasia, documento, contatos, endereço e chaves Pix. É um recurso de leitura e escrita, e cada fornecedor é um objeto plano, sem sub-recursos.

Módulofornecedores
Escopossuppliers:read para leitura, suppliers:write para escrita
Operaçõesleitura e escrita

Sem o módulo no contrato, a resposta é 403 module_not_enabled. Sem o escopo na chave, é 403 insufficient_scope. suppliers:write concede também a leitura.

MétodoEndpointEscopoDescrição
GET/v1/supplierssuppliers:readLista fornecedores, com paginação por cursor
GET/v1/suppliers/{id}suppliers:readBusca um fornecedor pelo id
POST/v1/supplierssuppliers:writeCria um fornecedor e responde 201
PATCH/v1/suppliers/{id}suppliers:writeAtualização parcial: envie só os campos que mudam
DELETE/v1/suppliers/{id}suppliers:writeDesativa o fornecedor e responde 204
CampoTipoDescrição
iduuidIdentificador do fornecedor
namestring | nullNome de exibição, como aparece no app
legal_namestring | nullRazão social
trade_namestring | nullNome fantasia
document_numberstring | nullCPF ou CNPJ
emailstring | nullE-mail de contato
phonestring | nullTelefone principal
phone1string | nullTelefone adicional
phone2string | nullTelefone adicional
phone3string | nullTelefone adicional
rgstring | nullRG, para fornecedor pessoa física
birth_datedate (YYYY-MM-DD) | nullData de nascimento, para pessoa física
is_employeeboolean | nullIndica se o fornecedor também é colaborador
codestring | nullCódigo interno de referência
is_activeboolean | nullfalse quando o fornecedor foi desativado
address_streetstring | nullLogradouro
address_numberstring | nullNúmero
address_neighborhoodstring | nullBairro
address_citystring | nullCidade
address_statestring | nullUF
address_countrystring | nullPaís
address_zip_codestring | nullCEP
pix_keysarray<object> | nullChaves Pix do fornecedor
created_attimestampData de criação, em ISO 8601
updated_attimestamp | nullÚltima atualização, em ISO 8601

No POST, todos os campos são opcionais com uma exceção: pelo menos um entre name, legal_name e trade_name é obrigatório. Sem nenhum deles a resposta é 422 validation. O is_active não é aceito no corpo da requisição; o servidor o define como true na criação. No PATCH, envie apenas os campos que quer alterar.

Nos GET, o parâmetro fields devolve campos parciais: ?fields=id,name,document_number,email.

A sintaxe do filtro é filter[campo][operador]=valor, com os operadores eq, neq, gt, gte, lt, lte, in, nin, ilike e is_null. Os detalhes estão em Paginação, filtros e ordenação.

CampoUso típicoExemplo
nameBusca por nome, com ilike e %filter[name][ilike]=%distribuidora%
legal_nameBusca por razão socialfilter[legal_name][ilike]=%ltda%
trade_nameBusca por nome fantasiafilter[trade_name][ilike]=%beleza%
document_numberConsulta por CPF ou CNPJfilter[document_number][eq]=12345678000190
emailConsulta por e-mailfilter[email][eq]=contato@fornecedor.com.br
is_activeSó os ativosfilter[is_active][eq]=true
is_employeeFornecedores que também são colaboradoresfilter[is_employee][eq]=true
address_cityPor cidadefilter[address_city][ilike]=curitiba
address_statePor UFfilter[address_state][eq]=PR
created_atPor períodofilter[created_at][gte]=2026-01-01

A ordenação padrão é -created_at, do mais recente para o mais antigo. Os campos aceitos em sort são created_at, updated_at e name.

Os exemplos abaixo supõem as duas variáveis de ambiente do Início rápido:

Terminal window
export LIGGA_API_KEY='ligga_live_…'
export LIGGA_BASE='https://api.ligga.app/functions/v1/api'
Terminal window
curl -G "$LIGGA_BASE/v1/suppliers" \
-H "Authorization: Bearer $LIGGA_API_KEY" \
--data-urlencode "limit=2" \
--data-urlencode "filter[is_active][eq]=true" \
--data-urlencode "filter[address_state][eq]=PR" \
--data-urlencode "sort=-created_at"
{
"data": [
{
"id": "3f8a2b1c-7d4e-4f5a-9b6c-1d2e3f4a5b6c",
"name": "Beleza Pura Distribuidora",
"legal_name": "Beleza Pura Distribuidora de Cosméticos LTDA",
"trade_name": "Beleza Pura",
"document_number": "12345678000190",
"email": "compras@belezapura.com.br",
"phone": "+55 41 3333-4444",
"phone1": "+55 41 99999-1234",
"phone2": null,
"phone3": null,
"rg": null,
"birth_date": null,
"is_employee": false,
"code": "FORN-001",
"is_active": true,
"address_street": "Rua das Flores",
"address_number": "1500",
"address_neighborhood": "Centro",
"address_city": "Curitiba",
"address_state": "PR",
"address_country": "Brasil",
"address_zip_code": "80020-000",
"pix_keys": [
{ "type": "cnpj", "key": "12345678000190" }
],
"created_at": "2026-06-10T14:22:05.000Z",
"updated_at": "2026-07-01T09:10:44.000Z"
},
{
"id": "9c1d5e7f-2a3b-4c8d-b0e1-6f7a8b9c0d1e",
"name": "João Marceneiro",
"legal_name": null,
"trade_name": null,
"document_number": "12345678909",
"email": null,
"phone": "+55 41 98888-7777",
"phone1": null,
"phone2": null,
"phone3": null,
"rg": "1.234.567-8",
"birth_date": "1985-03-22",
"is_employee": false,
"code": null,
"is_active": true,
"address_street": null,
"address_number": null,
"address_neighborhood": null,
"address_city": "São José dos Pinhais",
"address_state": "PR",
"address_country": "Brasil",
"address_zip_code": null,
"pix_keys": [
{ "type": "phone", "key": "+5541988887777" }
],
"created_at": "2026-05-02T11:00:00.000Z",
"updated_at": null
}
],
"pagination": {
"next_cursor": "eyJpZCI6IjljMWQ1ZTdmLi4uIiwidiI6IjIwMjYtMDUtMDJUMTE6MDA6MDBaIn0",
"has_more": true,
"limit": 2
},
"meta": { "request_id": "req_01JZXQ8V2K5M7N9P0R1S2T3U4V" }
}

O cursor da próxima página está em pagination.next_cursor. Repasse-o em ?cursor= enquanto has_more for true.

Terminal window
curl "$LIGGA_BASE/v1/suppliers/3f8a2b1c-7d4e-4f5a-9b6c-1d2e3f4a5b6c" \
-H "Authorization: Bearer $LIGGA_API_KEY"

A resposta traz o mesmo objeto de fornecedor da listagem, dentro do envelope de item: { "data": { … }, "meta": { "request_id": "req_…" } }.

POST é uma operação de escrita. Envie o cabeçalho Idempotency-Key para poder fazer uma nova tentativa sem duplicar o cadastro.

Terminal window
curl -X POST "$LIGGA_BASE/v1/suppliers" \
-H "Authorization: Bearer $LIGGA_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "Beleza Pura Distribuidora",
"legal_name": "Beleza Pura Distribuidora de Cosméticos LTDA",
"trade_name": "Beleza Pura",
"document_number": "12345678000190",
"email": "compras@belezapura.com.br",
"phone": "+55 41 3333-4444",
"code": "FORN-001",
"address_city": "Curitiba",
"address_state": "PR",
"address_zip_code": "80020-000",
"pix_keys": [{ "type": "cnpj", "key": "12345678000190" }]
}'

A resposta é 201 Created com o objeto completo, já com o is_active: true definido pelo servidor:

{
"data": {
"id": "3f8a2b1c-7d4e-4f5a-9b6c-1d2e3f4a5b6c",
"name": "Beleza Pura Distribuidora",
"legal_name": "Beleza Pura Distribuidora de Cosméticos LTDA",
"trade_name": "Beleza Pura",
"document_number": "12345678000190",
"email": "compras@belezapura.com.br",
"phone": "+55 41 3333-4444",
"phone1": null,
"phone2": null,
"phone3": null,
"rg": null,
"birth_date": null,
"is_employee": null,
"code": "FORN-001",
"is_active": true,
"address_street": null,
"address_number": null,
"address_neighborhood": null,
"address_city": "Curitiba",
"address_state": "PR",
"address_country": null,
"address_zip_code": "80020-000",
"pix_keys": [
{ "type": "cnpj", "key": "12345678000190" }
],
"created_at": "2026-07-10T15:30:00.000Z",
"updated_at": null
},
"meta": { "request_id": "req_01JZY0A1B2C3D4E5F6G7H8J9K0" }
}

O PATCH é parcial: os campos que você não enviar continuam como estão.

Terminal window
curl -X PATCH "$LIGGA_BASE/v1/suppliers/3f8a2b1c-7d4e-4f5a-9b6c-1d2e3f4a5b6c" \
-H "Authorization: Bearer $LIGGA_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"email": "financeiro@belezapura.com.br",
"phone1": "+55 41 97777-0000"
}'

A resposta é 200 OK com o fornecedor já atualizado, no envelope de item.

Terminal window
curl -X DELETE "$LIGGA_BASE/v1/suppliers/3f8a2b1c-7d4e-4f5a-9b6c-1d2e3f4a5b6c" \
-H "Authorization: Bearer $LIGGA_API_KEY"

A resposta é 204 No Content, sem corpo. O fornecedor passa a ter is_active: false.

HTTPtypeQuando acontece
401invalid_tokenCabeçalho Authorization ausente ou chave inexistente
401token_revokedA chave foi revogada
401token_expiredA chave passou da data de expiração
403module_not_enabledMódulo fornecedores fora do contrato
403insufficient_scopeChave sem suppliers:read na leitura ou suppliers:write na escrita
404not_foundid inexistente ou pertencente a outra conta
409idempotency_conflictMesma Idempotency-Key reaproveitada com corpo diferente
422validationPOST sem nenhum de name, legal_name e trade_name; birth_date fora do formato YYYY-MM-DD; e-mail inválido; filtro, operador ou cursor não aceito
429rate-limit-exceededLimite de requisições do plano excedido

O corpo do erro traz type, title, status e request_id. O formato completo está em Erros.