Gravar a fotografia da estrutura de mídia
const url = 'https://dattacrm.com.br/api/v1/ad-entities';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"platform":"meta","records":[{"level":"campaign","entityId":"example","name":"example","campaignId":"example","campaignName":"example","adsetId":"example","adsetName":"example","status":"example","effectiveStatus":"example","dailyBudget":1,"lifetimeBudget":1,"budgetRemaining":1,"collectedAt":"2026-11-04T13:00:00Z","extra":{"additionalProperty":"example"}}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://dattacrm.com.br/api/v1/ad-entities \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "platform": "meta", "records": [ { "level": "campaign", "entityId": "example", "name": "example", "campaignId": "example", "campaignName": "example", "adsetId": "example", "adsetName": "example", "status": "example", "effectiveStatus": "example", "dailyBudget": 1, "lifetimeBudget": 1, "budgetRemaining": 1, "collectedAt": "2026-11-04T13:00:00Z", "extra": { "additionalProperty": "example" } } ] }'Grava, em lote, o estado atual das campanhas, conjuntos e anúncios de uma plataforma (meta, google, tiktok ou linkedin) na conta da chave: nome, status próprio, veiculação (effectiveStatus) e orçamentos diário, total e restante. A chave natural de cada registro é platform + level + entityId: se já existe, é atualizado só com os campos enviados (o que não vem fica como está; null enviado grava null; extra, quando vem, substitui o anterior inteiro; collectedAt é regravado); se não existe, é criado. Um registro com collectedAt mais antigo que o já gravado (reenvio atrasado) é ignorado e não conta em upserted, para não desfazer um estado mais novo. A fotografia guarda só o estado atual: reenviar a estrutura de hora em hora é seguro e idempotente, e a entidade que fica mais de 30 dias sem ser enviada sai sozinha. Quando a fotografia mais recente da conta tem mais de 6 horas, o CRM volta a deduzir o status pela mídia diária (/ad-metrics). Se level e entityId se repetem no mesmo lote, vale o último. De 1 a 500 registros por chamada; um registro inválido recusa o lote inteiro (400, com o índice do registro em details) e nada é gravado. Os orçamentos ficam na moeda da conta de anúncios, sem conversão. A estrutura não conta no limite do plano. Exige chave com acesso de leitura e escrita.
Authorizations
Seção intitulada “Authorizations ”Request Body required
Seção intitulada “Request Body required ”Lote da fotografia da estrutura de mídia de uma plataforma.
object
Plataforma de anúncios de todos os registros do lote: meta, google, tiktok ou linkedin.
De 1 a 500 registros. Se level e entityId se repetem no lote, vale o último. Um registro inválido recusa o lote inteiro e nada é gravado.
Estado atual de uma campanha, conjunto ou anúncio.
object
Nível da entidade: campaign (campanha), adset (conjunto de anúncios ou grupo de anúncios) ou ad (anúncio).
Identificador da entidade na plataforma. Com platform e level, é a chave do registro.
Quando a plataforma foi lida, em ISO 8601 com fuso (ex.: 2026-11-04T13:00:00Z ou 2026-11-04T10:00:00-03:00). Não pode passar de agora mais 10 minutos (400). Um registro com collectedAt mais antigo que o já gravado é ignorado.
Example
2026-11-04T13:00:00ZQualquer outro dado da entidade (objetivo, lance, datas de início e fim etc.), como objeto JSON. Quando enviado, substitui o extra anterior inteiro; quando ausente, o anterior fica.
object
Responses
Seção intitulada “ Responses ”Sucesso.
object
Resultado da gravação do lote.
object
Quantas entidades foram gravadas (criadas ou atualizadas), já juntadas as repetidas do lote. A entidade cujo collectedAt é mais antigo que o gravado não conta.
Example generated
{ "data": { "upserted": 1 }}Headers
Seção intitulada “Headers ”Identificador da requisição, para suporte.
Máximo de requisições por janela de 60 segundos para esta chave.
Requisições restantes na janela atual.
Fim da janela atual, em milissegundos desde a época Unix (epoch ms).
Dados inválidos na requisição (validation_error): platform ou level desconhecidos, mais de 500 registros, collectedAt fora do formato ISO 8601 com fuso ou mais de 10 minutos no futuro, ou orçamento negativo. O índice do registro vem em details[].path (ex.: records.3.collectedAt). Nada é gravado.
Formato de erro da API.
object
object
Código estável do erro, ex.: validation_error.
Mensagem legível em português.
Detalhes extras, ex.: lista de campos inválidos.
Identificador da requisição, para suporte.
Example generated
{ "error": { "code": "example", "message": "example", "details": "example", "requestId": "example" }}Headers
Seção intitulada “Headers ”Identificador da requisição, para suporte.
Chave ausente, inválida (invalid_api_key), vencida (api_key_expired) ou revogada (api_key_revoked).
Formato de erro da API.
object
object
Código estável do erro, ex.: validation_error.
Mensagem legível em português.
Detalhes extras, ex.: lista de campos inválidos.
Identificador da requisição, para suporte.
Example generated
{ "error": { "code": "example", "message": "example", "details": "example", "requestId": "example" }}Headers
Seção intitulada “Headers ”Identificador da requisição, para suporte.
A chave é somente leitura e a operação grava dados (insufficient_scope).
Formato de erro da API.
object
object
Código estável do erro, ex.: validation_error.
Mensagem legível em português.
Detalhes extras, ex.: lista de campos inválidos.
Identificador da requisição, para suporte.
Example generated
{ "error": { "code": "example", "message": "example", "details": "example", "requestId": "example" }}Headers
Seção intitulada “Headers ”Identificador da requisição, para suporte.
Conflito com o estado atual (conflict), contato oculto, cujo negócio não muda (lead_hidden), ou limite do plano atingido (plan_limit).
Formato de erro da API.
object
object
Código estável do erro, ex.: validation_error.
Mensagem legível em português.
Detalhes extras, ex.: lista de campos inválidos.
Identificador da requisição, para suporte.
Example generated
{ "error": { "code": "example", "message": "example", "details": "example", "requestId": "example" }}Headers
Seção intitulada “Headers ”Identificador da requisição, para suporte.
O corpo da requisição passa de 2 MB (payload_too_large).
Formato de erro da API.
object
object
Código estável do erro, ex.: validation_error.
Mensagem legível em português.
Detalhes extras, ex.: lista de campos inválidos.
Identificador da requisição, para suporte.
Example generated
{ "error": { "code": "example", "message": "example", "details": "example", "requestId": "example" }}Headers
Seção intitulada “Headers ”Identificador da requisição, para suporte.
Limite de requisições atingido (rate_limited). Aguarde Retry-After segundos.
Formato de erro da API.
object
object
Código estável do erro, ex.: validation_error.
Mensagem legível em português.
Detalhes extras, ex.: lista de campos inválidos.
Identificador da requisição, para suporte.
Example generated
{ "error": { "code": "example", "message": "example", "details": "example", "requestId": "example" }}Headers
Seção intitulada “Headers ”Identificador da requisição, para suporte.
Máximo de requisições por janela de 60 segundos para esta chave.
Requisições restantes na janela atual.
Fim da janela atual, em milissegundos desde a época Unix (epoch ms).
Segundos até poder tentar de novo.
Erro interno (internal_error). Informe o requestId ao suporte.
Formato de erro da API.
object
object
Código estável do erro, ex.: validation_error.
Mensagem legível em português.
Detalhes extras, ex.: lista de campos inválidos.
Identificador da requisição, para suporte.
Example generated
{ "error": { "code": "example", "message": "example", "details": "example", "requestId": "example" }}Headers
Seção intitulada “Headers ”Identificador da requisição, para suporte.
O CRM está em modo somente leitura durante uma migração (maintenance). Tente de novo depois de Retry-After segundos.
Formato de erro da API.
object
object
Código estável do erro, ex.: validation_error.
Mensagem legível em português.
Detalhes extras, ex.: lista de campos inválidos.
Identificador da requisição, para suporte.
Example generated
{ "error": { "code": "example", "message": "example", "details": "example", "requestId": "example" }}Headers
Seção intitulada “Headers ”Identificador da requisição, para suporte.
Segundos até poder tentar de novo.