1 Visão geral e credenciais
Formato JSON (envie Content-Type: application/json). A API enxerga e faz exatamente o que o usuário do CRM vinculado à credencial pode fazer — perfis e compartilhamento valem na API.
As 3 credenciais — obrigatórias em toda requisição
| Credencial | Onde vai | O que é |
|---|---|---|
| Aplicação (nome + senha) | HTTP Basic Auth (-u nome:senha) | Registro criado em Web Service — Aplicações |
| Chave da API | Header x-api-key | Gerada automaticamente ao criar a aplicação |
| Token de sessão | Header x-token | Obtido no login (seção 3); não vai na chamada de login |
2 Criar as credenciais
Feito uma única vez, no DeskCRM, por um administrador — menu ⚙️ Configurações → Integração.
Aplicação — Web Service — Aplicações
- + Adicionar → Tipo: WebserviceStandard · Estado: Ativo (marcar!) · Nome: ex.
integracao· Senha forte - IPs permitidos (opcional, recomendado se o consumidor tem IP fixo) · URL pública: pode ficar vazio
- Salvar e copiar a Chave da API exibida na lista (ícone 👁)
Usuário da API — Web Service — Users
- Selecionar o container WebserviceStandard → + Criar
- Servidor: a aplicação do passo a · Status: Ativo · Login: ex.
integracao.api· Senha forte - Tipo: Permissões baseadas em usuário · Usuário: o usuário do CRM que empresta as permissões · Método de autenticação: Senha
Crie um usuário do CRM dedicado (ex. “Integração”) com um perfil restrito ao necessário, em vez de vincular ao administrador — dá rastreabilidade e revogação limpa.
3 Autenticação (login → token)
/Users/Logincurl -u 'integracao:SENHA_DA_APLICACAO' \
-H 'x-api-key: CHAVE_DA_API' \
-H 'Content-Type: application/json' \
-X POST 'https://deskcrm.com.br/webservice/WebserviceStandard/Users/Login' \
-d '{"userName":"integracao.api","password":"SENHA_DO_USUARIO_API"}'
Resposta: {"status":1,"result":{"token":"…", …}} → guarde o token.
- Validade do token: 24 h após o login ou 4 h sem uso — o que vencer primeiro.
- Ao receber 401 em qualquer chamada, refaça o login e repita a chamada.
- Logout (opcional):
PUT /Users/Logoutcom os 3 headers.
Toda chamada daqui em diante leva as 3 credenciais: -u app:senha + header x-api-key + header x-token.
4 Descobrir módulos e todos os campos
/Modulesmódulos disponíveis para o usuário/{Módulo}/Fieldstodos os campos do módulo/Fields responde, por campo: name (nome técnico usado no JSON), label, type, mandatory (obrigatório), picklistvalues (valores aceitos em listas), referenceList (módulos referenciáveis), defaultvalue… É a fonte da verdade: módulos e campos customizados aparecem aqui automaticamente.
Módulos principais do DeskCRM
| Nome técnico (na URL) | Nome na tela |
|---|---|
Accounts | Cliente (Contas) |
Contacts | Contatos |
Products | Produtos |
SQuotes | Propostas |
SSalesProcesses | Negócios |
Placascontrato | Placas do contrato |
ServiceContracts | Contratos de serviço |
Documents | Documentos |
Calendar | Agenda / Atividades |
5 CRUD de registros
/{Módulo}/Recordcriarcurl -u 'integracao:SENHA' -H 'x-api-key: CHAVE' -H 'x-token: TOKEN' \
-H 'Content-Type: application/json' \
-X POST 'https://deskcrm.com.br/webservice/WebserviceStandard/Accounts/Record' \
-d '{"accountname":"Empresa Exemplo LTDA","assigned_user_id":1,"cpf_cliente":"12345678900"}'
# → {"status":1,"result":{"id":1025,"name":"Empresa Exemplo LTDA"}}
/{Módulo}/Record/{id}alterar — só os campos enviados mudamcurl … -X PUT '…/Accounts/Record/1025' -d '{"accountname":"Novo Nome"}'
Sempre confira o skippedData na resposta. Campo com nome errado ou não editável é ignorado silenciosamente — não gera erro; ele aparece listado nesse array.
/{Módulo}/Record/{id}lerRetorna os campos em formato de exibição. Com o header x-raw-data: 1, vem também o rawData (valores crus, como estão no banco).
/{Módulo}/Record/{id}excluirO DELETE move o registro para a Lixeira (recuperável pelo CRM). Não apaga definitivamente.
/{Módulo}/RecordsListlistar com filtros e paginação| Header | Função | Exemplo |
|---|---|---|
x-row-limit | quantidade por página (padrão 100) | 50 |
x-row-offset | deslocamento (paginação) | 100 |
x-fields | retornar só estes campos (JSON) | ["accountname","cpf_cliente"] |
x-condition | filtro (JSON — ver abaixo) | — |
x-order-by | ordenação (JSON) | {"accountname":"ASC"} |
x-row-count | devolve o total geral | 1 |
x-raw-data | valores crus | 1 |
Filtro (x-condition)
{"fieldName":"cpf_cliente","value":"12345678900","operator":"e"}
# composto:
{"condition":"AND","rules":[
{"fieldName":"accounttype","value":"Customer","operator":"e"},
{"fieldName":"createdtime","value":"2026-01-01","operator":"a"}
]}
Operadores comuns: e igual · n diferente · c contém · s começa com · a maior · m menor.
Outros endpoints úteis
/{Módulo}/RecordRelatedList/{id}/{MóduloRelacionado}relacionados/{Módulo}/RecordHistory/{id}histórico de alterações/{Módulo}/Privilegeso que o usuário da API pode fazer/{Módulo}/CustomViewlistas customizadas (filtros salvos)6 Formato dos valores por tipo de campo
| Tipo de campo | Como enviar | Exemplo |
|---|---|---|
| Texto / e-mail / telefone | string | "Empresa X" |
| Lista de seleção (picklist) | valor exato (ver /Fields) | "INSTALAÇÃO" |
| Data | AAAA-MM-DD | "2026-07-12" |
| Data e hora | AAAA-MM-DD HH:MM:SS | "2026-07-12 14:30:00" |
Responsável (assigned_user_id) | id do usuário do CRM | 1 |
| Referência a outro registro | crmid do registro | 1234 |
| Caixa de seleção | 0 ou 1 | 1 |
| Decimal | ponto como separador | 49.90 |
Moeda múltipla (ex. unit_price) | JSON de moeda (moeda 1 = BRL) | {"currencyId":1,"currencies":{"1":{"price":49.9}}} |
unit_price (Preço Unitário de Produtos) é multiCurrency: número simples não funciona — use o JSON da tabela acima (estrutura validada neste servidor).
7 Erros e tratamento
| HTTP | Significado | O que fazer |
|---|---|---|
401 | credencial, api-key ou token inválido/expirado | refazer login e repetir a chamada |
403 | sem permissão (perfil do usuário CRM) | ajustar perfil/papel no CRM |
404 | rota ou registro inexistente | conferir módulo e id |
405 | método não permitido | conferir GET/POST/PUT/DELETE |
400 | payload inválido (JSON malformado, obrigatório faltando) | conferir o corpo enviado |
Formato do erro: {"status":0,"error":{"message":"…","code":401}} — trate status: 0 como falha mesmo quando o HTTP vier 200.
Campos obrigatórios: consulte GET /{Módulo}/Fields → mandatory: true. POST sem eles retorna 400/406.
8 Boas práticas
- Só HTTPS; nunca versionar credenciais em repositório.
- Restrinja por IP no cadastro da aplicação se o consumidor tiver IP fixo.
- Um par aplicação + usuário por sistema integrado — rastreabilidade e revogação limpa.
- Reaproveite o token pelas 24 h / 4 h — não faça login a cada chamada.
- Histórico de acessos: tabela
l_yf_api_login_history(mostra erros de login — útil no debug).
9 Teste de homologação executado
Ciclo completo executado em produção em 12/07/2026:
- ✓
POST /Users/Login→ token recebido - ✓
POST /Accounts/Record“TESTE API — PODE EXCLUIR” → criado (id 1025) - ✓
PUT /Accounts/Record/1025alterou o nome (campo inexistente veio emskippedData) - ✓
GET /Accounts/Record/1025confirmou a alteração - ✓
DELETE /Accounts/Record/1025→ lixeira - ✓Registro e credenciais de teste removidos ao final