Gravar métricas de mídia por anúncio e dia
const url = 'https://dattacrm.com.br/api/v1/ad-metrics';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"platform":"meta","records":[{"date":"2026-11-03","adId":"example","accountId":"example","accountName":"example","campaignId":"example","campaignName":"example","adsetId":"example","adsetName":"example","adName":"example","adStatus":"example","adUrl":"example","adThumbnail":"example","spend":1,"impressions":1,"reach":1,"clicks":1,"pageViews":1,"platformLeads":1,"checkouts":1,"platformPurchases":1,"platformRevenue":1,"messagingStarted":1,"currency":"example","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-metrics \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "platform": "meta", "records": [ { "date": "2026-11-03", "adId": "example", "accountId": "example", "accountName": "example", "campaignId": "example", "campaignName": "example", "adsetId": "example", "adsetName": "example", "adName": "example", "adStatus": "example", "adUrl": "example", "adThumbnail": "example", "spend": 1, "impressions": 1, "reach": 1, "clicks": 1, "pageViews": 1, "platformLeads": 1, "checkouts": 1, "platformPurchases": 1, "platformRevenue": 1, "messagingStarted": 1, "currency": "example", "extra": { "additionalProperty": "example" } } ] }'Grava, em lote, as métricas de anúncios de uma plataforma (meta, google, tiktok ou linkedin) na conta da chave: investimento, impressões, cliques e conversões da plataforma, uma linha por dia e anúncio. A chave natural de cada linha é platform + date + adId: se já existe, é atualizada só com os campos enviados (o que não vem fica como está; null enviado grava null; extra, quando vem, substitui o anterior inteiro); se não existe, é criada. Por isso o reenvio de uma janela de dias (7 na Meta e no TikTok, 30 no Google) é seguro e idempotente: sobrescreve o que já existe e não duplica. Se date e adId 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. A moeda é a da conta de anúncios, sem conversão: currency é opcional e, ausente, vale a moeda da conta no CRM; um registro com moeda diferente da conta recusa o lote (400), para não somar moedas. A mídia 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 de métricas 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 date e adId se repetem no lote, vale o último. Um registro inválido recusa o lote inteiro e nada é gravado.
Métricas de um anúncio em um dia.
object
Dia da métrica na plataforma (data civil na conta de anúncios), no formato AAAA-MM-DD.
Example
2026-11-03Identificador do anúncio na plataforma (no Google PMax, o id do grupo de recursos). Com platform e date, é a chave do registro.
Investimento do dia, na moeda da conta de anúncios. (zero a 999999999999.99).
Impressões do dia.
Alcance do dia.
Cliques no link do dia.
Visualizações da página de destino do dia.
Leads contados pela plataforma no dia.
Inícios de checkout contados pela plataforma no dia.
Compras contadas pela plataforma no dia.
Receita das compras contadas pela plataforma no dia. (zero a 999999999999.99).
Conversas iniciadas (mensagens) no dia.
Qualquer outro dado do registro (vídeo, engajamento, LinkedIn 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 linhas foram gravadas (criadas ou atualizadas), já juntadas as repetidas do lote.
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 desconhecida, mais de 500 registros, date fora do formato AAAA-MM-DD ou currency diferente da moeda da conta. O índice do registro vem em details[].path (ex.: records.3.date). 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.