API de Transmissões
Uma transmissão é um envio de saída: um público, uma mensagem de abertura, um canal e um agendamento. Opcionalmente, também nomeia o Agente de IA que lida com as respostas recebidas. A API de Transmissões permite-lhe criar, definir preços, lançar e monitorizar esses envios a partir do seu próprio código em vez do painel de controlo. Para o produto em si, consulte o guia de Transmissões.
- URL Base —
https://api.youraiconnector.com/v1 - Autenticação — a sua chave de API (ver Autenticação)
- Erros e paginação — ver Erros e Paginação
Todos os exemplos abaixo mostram o formato de consulta ?apiKey= em cURL e o cabeçalho X-API-Key em JavaScript e Python — qualquer um funciona em todos os endpoints.
No explorador da API. Todos os endpoints nesta página estão na especificação OpenAPI publicada, pelo que pode consultar os seus campos exatos e executar pedidos em tempo real no explorador da API.
Como um envio é estruturado
O envio de uma transmissão requer quatro chamadas, não apenas uma:
- Crie a transmissão com o seu público, canal e agendamento — começa como um
Draft. - Defina a mensagem de abertura. No WhatsApp Business, isso significa submeter um modelo para aprovação (ou escolher um que já tenha sido aprovado). Em qualquer outro canal, é texto simples.
- Estime o custo se quiser verificar o preço antes de gastar algo (opcional).
- Lance a transmissão. O lançamento executa uma verificação completa — público, mensagem, aprovação de modelo, remetente ligado — e inicia o envio ou indica exatamente o que falta.
Nada é enviado até que chame o lançamento.
O objeto de transmissão
{
"id": "bcd123abc456",
"name": "June promo",
"status": "Draft",
"channel": "whatsapp",
"agent_id": "agt_789",
"list_id": "lst_456",
"list_name": "Newsletter subscribers",
"total_contacts": 240,
"send_to_new_list_members": false,
"whats_app_template": {
"body": "Hi {{first_name}}, our June offer is live.",
"status": "approved",
"sid": "HX0123...",
"language": "en",
"category": "marketing",
"variables": ["first_name"]
},
"execution_date": 1781000000000,
"drip_mode": true,
"time_critical": false,
"total_contacts_sent": 0,
"credits_used": 0,
"created_at": 1780900000000,
"last_modified_at": 1780900000000
}
Os carimbos de data/hora são devolvidos como milissegundos da época (execution_date, created_at, last_modified_at, …), e qualquer referência de contacto é devolvida como uma string de caminho como contacts/uid_whatsapp_15551234567.
Campos que define
| Campo | Descrição |
|---|---|
name |
Como a transmissão é chamada no painel de controlo. |
channel |
O único canal através do qual esta transmissão envia: whatsapp, whatsapp_web, sms, instagram, messenger, facebook, telegram, instagram_private, line, viber, imessage, email, chat_widget, custom_channel. Uma transmissão tem exatamente um canal — para enviar a mesma coisa noutro local, duplique-a para outro canal. tiktok e skool são apenas para respostas e nunca podem ser usados para transmissões. |
agent_id |
O Agente de IA que responde às mensagens. Deixe como null e as respostas irão para a caixa de entrada da sua equipa. |
list_id |
A lista de contactos para a qual enviar. É assim que define o público a partir da API — consulte Contactos para criar e preencher listas. |
list_name |
Nome de exibição mostrado junto à transmissão. Cosmético. |
send_to_new_list_members |
true mantém a transmissão ativa para que qualquer pessoa adicionada à lista mais tarde também receba a mensagem de abertura. |
whats_app_template |
A mensagem de abertura. No WhatsApp Business, é um modelo real aprovado; em qualquer outro canal, o seu body é usado como o texto de abertura simples. Defina-o através dos endpoints de modelos, não manualmente. |
opener_media |
Uma imagem ou vídeo enviado com a abertura. Envie sempre o objeto completo (ou null para o remover) — escrever chaves individuais dentro dele será rejeitado. Não suportado em SMS. |
execution_date |
Quando enviar. Envie um carimbo de data/hora ISO 8601 ou milissegundos da época. Uma data futura agenda o envio; omita-o (ou use uma data passada) para enviar assim que lançar. |
drip_mode |
true espaça o envio em lotes ao longo do tempo em vez de tudo de uma vez. |
time_critical |
true desativa o espaçamento automático que é ativado acima de 50 contactos — para um público recetivo que precisa da mensagem agora. Não levanta o limite diário de envio do próprio canal. |
batch_size |
Quantos contactos por lote ao enviar gradualmente. |
follow_up_config |
A cadeia de seguimento para contactos que nunca respondem. |
Qualquer coisa que envie como user_id, id, status ou source_campaign_id é ignorada na criação e descartada na atualização — o estado apenas muda através dos endpoints de lançamento, pausa e retoma abaixo.
Campos que a plataforma mantém
status, total_contacts_sent, unique_contacts_replied, overall_reply_rate, credits_used, paused_reason, completion_summary, os contadores de lote e contacts (os contactos individuais anexados a partir do painel de controlo, lidos como strings de caminho). Leia-os, não os escreva.
Estados
| Estado | Significado |
|---|---|
Draft |
A ser criado. Nada está agendado. |
Pending Approval |
Lançado, mas o seu modelo de WhatsApp ainda aguarda uma decisão. Começa a enviar automaticamente assim que o modelo for aprovado — não precisa de lançar novamente. |
Scheduled |
Lançado com um execution_date futuro. |
Sending |
A enviar ativamente (uma difusão preparada para novos membros da lista permanece aqui enquanto aguarda por eles). |
Paused |
Suspenso — por si, ou automaticamente por uma verificação de segurança. |
Sent |
Concluído. |
Failed |
Concluído com mais de metade dos envios falhados. |
Criar uma difusão
POST /broadcasts — cria uma Draft.
cURL
curl -X POST "https://api.youraiconnector.com/v1/broadcasts?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "June promo",
"channel": "whatsapp",
"list_id": "lst_456",
"agent_id": "agt_789",
"drip_mode": true,
"execution_date": "2026-06-15T09:00:00.000Z"
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/broadcasts", {
method: "POST",
headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({
name: "June promo",
channel: "whatsapp",
list_id: "lst_456",
agent_id: "agt_789",
drip_mode: true,
execution_date: "2026-06-15T09:00:00.000Z",
}),
});
const { broadcast_id } = await res.json();
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/broadcasts",
headers={"X-API-Key": "YOUR_API_KEY"},
json={
"name": "June promo",
"channel": "whatsapp",
"list_id": "lst_456",
"agent_id": "agt_789",
"drip_mode": True,
"execution_date": "2026-06-15T09:00:00.000Z",
},
)
print(res.json()["broadcast_id"])
Resposta (201)
{ "success": true, "broadcast_id": "bcd123abc456" }
Listar difusões
GET /broadcasts — todas as difusões na conta, da mais recente para a mais antiga.
Parâmetros de consulta
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
status |
Não | Devolve apenas difusões num determinado estado, p. ex. Sending. Corresponda exatamente à grafia na tabela de estados. |
curl "https://api.youraiconnector.com/v1/broadcasts?apiKey=YOUR_API_KEY&status=Sending"
const res = await fetch("https://api.youraiconnector.com/v1/broadcasts?status=Sending", {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const { broadcasts } = await res.json();
res = requests.get(
"https://api.youraiconnector.com/v1/broadcasts",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"status": "Sending"},
)
broadcasts = res.json()["broadcasts"]
Resposta (200)
{ "success": true, "broadcasts": [{ "id": "bcd123abc456", "name": "June promo", "status": "Sending", "...": "..." }] }
Obter uma difusão
GET /broadcasts/{broadcastId} — devolve { "success": true, "broadcast": { ... } }. Utilize-o para consultar um envio em curso: total_contacts_sent, unique_contacts_replied, overall_reply_rate e credits_used são atualizados à medida que o processo decorre.
curl "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456?apiKey=YOUR_API_KEY"
Uma difusão que não existe na sua conta devolve 404.
Atualizar uma difusão
PUT /broadcasts/{broadcastId} — envie apenas os campos que pretende alterar. Também pode endereçar uma única chave dentro de um objeto aninhado com um caminho pontuado, p. ex. "whats_app_template.body".
curl -X PUT "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "June promo (v2)", "execution_date": "2026-06-16T09:00:00.000Z" }'
await fetch("https://api.youraiconnector.com/v1/broadcasts/bcd123abc456", {
method: "PUT",
headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ name: "June promo (v2)", execution_date: "2026-06-16T09:00:00.000Z" }),
});
Um corpo vazio devolve 400. Duas regras que vale a pena conhecer:
opener_mediaé tudo ou nada. Envie o objeto completo, ounullpara remover o anexo. Um caminho pontuado para o mesmo (opener_media.name) é rejeitado com400, porque um anexo parcialmente atualizado descreveria um ficheiro que não existe.- O estado não é editável. Utilize lançar, pausar e retomar.
A mensagem de abertura
Cada difusão contém o seu elemento de abertura em whats_app_template. O que isso significa depende do canal:
- WhatsApp Business — tem de ser um modelo aprovado pelo WhatsApp. Utilize um dos dois endpoints abaixo.
- Todos os outros canais (WhatsApp Web, SMS, Instagram, Messenger, Telegram, …) — o
bodydo mesmo campo é simplesmente o texto que é enviado. Submetê-lo através do endpoint abaixo armazena-o e marca-o como pronto sem envolver o WhatsApp.
Submeter um modelo para aprovação
POST /broadcasts/{broadcastId}/template
| Campo | Obrigatório | Descrição |
|---|---|---|
body |
Sim | O texto da mensagem, até 1024 caracteres. Utilize marcadores de posição {{variable}} para personalização. |
name |
Não | Nome do modelo. Por predefinição, assume o nome da difusão. |
language |
Não | Código do idioma. Por predefinição, assume en. |
category |
Não | marketing (predefinição), utility, authentication ou authentication-international. É o valor pelo qual o envio é taxado, por isso seja rigoroso. |
variables |
Não | Os nomes dos marcadores de posição, pela ordem em que aparecem. Se omitir, são lidos a partir do corpo — que é normalmente o que pretende, uma vez que o envio os preenche a partir de cada contacto. |
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/template?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "Hi {{first_name}}, our June offer is live until Friday.",
"language": "en",
"category": "marketing"
}'
Resposta (200)
{ "success": true, "broadcast_id": "bcd123abc456", "template_status": "pending", "template_sid": "HX0123..." }
template_status é o que o WhatsApp indica: pending enquanto está a ser revisto, approved quando está pronto a utilizar, rejected se foi recusado. Num canal que não seja WhatsApp, a resposta é diretamente approved com template_sid: null — não há nada para rever.
Coisas que o impedirão:
- Submeter enquanto um modelo anterior ainda está sob revisão devolve
400. Aguarde primeiro pela decisão. - Editar um modelo que está atualmente aprovado mantém o aprovado ativo até que o novo seja processado, para que uma difusão em curso nunca perca o seu elemento de abertura.
- Num número WhatsApp ligado diretamente através da Meta, uma difusão com uma imagem ou vídeo anexado não pode ser submetida (
400) — os anexos são suportados na via gerida do WhatsApp Business e no WhatsApp Web.
Utilizar um modelo que já foi aprovado
POST /broadcasts/{broadcastId}/template/select — copia um modelo já aprovado da sua biblioteca de modelos para a difusão, pelo que não há nada por que esperar.
| Campo | Obrigatório | Descrição |
|---|---|---|
template_id |
Sim | O id de um modelo aprovado na sua conta. |
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/template/select?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "template_id": "tpl_abc123" }'
Resposta (200)
{
"success": true,
"broadcast_id": "bcd123abc456",
"template_status": "approved",
"template_sid": "HX0123...",
"body": "Hi {{first_name}}, our June offer is live until Friday.",
"name": "june_promo",
"language": "en",
"variables": ["first_name"],
"category": "marketing"
}
A aprovação é verificada do nosso lado a partir do registo da biblioteca — envia apenas o id. Recebe um 400 se a difusão não for um rascunho do WhatsApp, se o modelo não estiver aprovado, se for um modelo de seguimento em vez de um de abertura, ou se a difusão tiver um anexo (os modelos da biblioteca são apenas de texto). Um id de modelo que não esteja na sua conta devolve 404.
Estimar o custo
POST /broadcasts/{broadcastId}/estimate-cost — calcula o preço do envio antes de o confirmar. Disponível em difusões whatsapp e sms; qualquer outro canal devolve 400. A difusão necessita de um list_id, uma vez que a estimativa contabiliza a audiência.
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/estimate-cost?apiKey=YOUR_API_KEY"
Resposta do WhatsApp (200) — créditos, discriminados por país de destino:
{
"success": true,
"channel": "whatsapp",
"billing_mode": "credits",
"data": {
"countries": [
{ "countryCode": "31", "name": "Netherlands", "iso": "NL", "flag": "🇳🇱", "contactCount": 180, "costPerContact": 1.2, "subtotal": 216 },
{ "countryCode": "1", "name": "United States", "iso": "US", "flag": "🇺🇸", "contactCount": 60, "costPerContact": 0.9, "subtotal": 54 }
],
"totalContacts": 240,
"totalTemplateCost": 270,
"templateCategory": "marketing",
"billing_mode": "credits",
"service_messages_billable_soon": false
}
}
Resposta por SMS (200) — Dólares americanos, com base nos preços em tempo real da Twilio para a sua própria conta Twilio:
{
"success": true,
"channel": "sms",
"billing_mode": "twilio_direct",
"data": {
"totalContacts": 240,
"messageLength": 118,
"segmentsPerMessage": 1,
"totalSegments": 240,
"estimatedCostUsd": 1.788,
"priceUnit": "USD",
"billedByTwilio": true,
"billing_mode": "twilio_direct",
"service_messages_billable_soon": false
}
}
Leia billing_mode antes de mostrar um número. Indica-lhe quem está a ser cobrado:
billing_mode |
Quem paga | O que significam os valores |
|---|---|---|
credits |
A sua conta Your AI Connector | totalTemplateCost e os valores por país são créditos. |
twilio_direct |
A sua própria conta Twilio | estimatedCostUsd é o que a Twilio lhe cobrará. |
meta_waba_direct |
A sua própria conta WhatsApp Business, cobrada pela Meta | Cada valor de crédito aparece como null — propositadamente, para que nunca seja confundido com “gratuito”. As contagens de países e contactos continuam a ser precisas. |
O SMS sem credenciais Twilio ligadas continua a devolver as contagens de segmentos, com estimatedCostUsd: 0 — não existem preços a consultar.
Iniciar uma difusão
POST /broadcasts/{broadcastId}/launch
O início verifica tudo primeiro e só depois avança com a difusão. Não existe início parcial: ou começa, ou nada muda e recebe um erro a explicar o motivo.
cURL
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/launch?apiKey=YOUR_API_KEY"
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/launch", {
method: "POST",
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
if (!data.success) console.error(data.error);
Python
res = requests.post(
"https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/launch",
headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json())
Resposta (200)
{ "success": true, "broadcast_id": "bcd123abc456", "status": "Scheduled" }
status é onde a transmissão foi entregue:
Scheduled—execution_dateestá no futuro.Sending— começou agora.Pending Approval— o modelo do WhatsApp ainda está sob análise. Será enviado automaticamente assim que o modelo for aprovado; não chame o lançamento novamente.
Apenas uma transmissão Draft (ou uma Pending Approval cujo modelo tenha sido aprovado entretanto) pode ser lançada — qualquer outra coisa devolve 400.
Por que um lançamento é recusado
Cada um destes retorna como 400 com uma mensagem error em linguagem simples:
| Problema | O que corrigir |
|---|---|
| Sem público | Defina list_id (ou anexe contactos) antes de lançar. |
| Sem mensagem de abertura | Defina a abertura — veja A mensagem de abertura. |
| Anexo em SMS | SMS não pode conter uma imagem ou vídeo. Remova o anexo ou mova a transmissão para o WhatsApp. |
| Anexo não corresponde ao modelo aprovado | No WhatsApp, o conteúdo multimédia reside dentro do modelo aprovado, por isso, trocar o anexo posteriormente significa submeter o modelo novamente. |
| Modelo rejeitado | Reescreva a mensagem e submeta-a novamente. |
| Modelo nunca submetido | Submeta-o (ou selecione um aprovado) primeiro. |
| Modelo aprovado mas em falta na sua conta WhatsApp | Geralmente um modelo aprovado antes de o número terminar a ligação. Submeta-o novamente. |
| Sem remetente ligado para o canal | Ligue o canal primeiro — veja Canais. |
| Canal apenas de resposta | TikTok e Skool não permitem que uma empresa inicie uma conversa, por isso não podem ser usados para transmissões. |
| Já armado | A transmissão já tem um envio agendado. Pause-a antes de lançar novamente. |
| Ainda a aguardar aprovação | Será enviada automaticamente quando o modelo for aprovado. |
| Conta WhatsApp Business bloqueada pela Meta | A Meta interrompeu as conversas iniciadas pela empresa na sua própria conta WhatsApp Business — normalmente um problema de método de pagamento. Corrija-o no Gestor de Negócios da Meta. |
| Iniciada a partir de uma campanha clássica | Lance-a a partir do editor de campanhas. Veja campanhas clássicas em Transmissões. |
Pausar e retomar
POST /broadcasts/{broadcastId}/pause para uma transmissão Sending ou Scheduled e cancela tudo o que estiver na fila.
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/pause?apiKey=YOUR_API_KEY"
Pausar uma transmissão Pending Approval coloca-a de volta em Draft — nada estava agendado, por isso não há nada para retomar. Qualquer outro estado devolve 400.
POST /broadcasts/{broadcastId}/resume reinicia uma transmissão Paused:
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/resume?apiKey=YOUR_API_KEY"
Resposta (200)
{ "success": true, "broadcast_id": "bcd123abc456" }
Retoma em Sending, ou volta para Scheduled se o seu execution_date ainda estiver no futuro. Apenas uma transmissão Paused pode ser retomada.
Continuar o envio após uma pausa por baixo envolvimento
POST /broadcasts/{broadcastId}/override-engagement-guard
Enquanto uma transmissão é enviada em lotes, medimos quantas pessoas responderam a cada lote antes de iniciar o seguinte. Se quase ninguém responder, a transmissão pausa-se automaticamente — um envio que continua a insistir no silêncio é a forma mais rápida de um número ser filtrado ou bloqueado. É o botão Continuar mesmo assim no painel de controlo.
Como a taxa de resposta que causou a pausa não pode mudar enquanto a transmissão está parada, um resume simples seria apenas pausado novamente pela verificação seguinte. Este endpoint representa a decisão de continuar mesmo assim: regista a anulação nessa transmissão específica e levanta a pausa na mesma chamada, caso a transmissão tenha sido pausada por baixo envolvimento.
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/override-engagement-guard?apiKey=YOUR_API_KEY"
Resposta (200)
{ "success": true, "broadcast_id": "bcd123abc456", "status": "Sending", "resumed": true }
resumed: true— a transmissão foi pausada por baixo envolvimento e está agora a decorrer novamente;statusé o estado para onde foi retomada.resumed: false— nada foi levantado, a anulação é simplesmente registada para verificações futuras. É isto que obtém se a transmissão nunca tiver sido pausada, ou se tiver sido pausada por um motivo diferente (pausou-a manualmente, atingiu um limite de envio ou demasiados envios deram erro). Essas pausas não são levantadas aqui — retome-a manualmente depois de resolver a causa.
A anulação aplica-se apenas a esta transmissão. Não é uma definição da conta e é seguro chamar duas vezes.
Duplicar uma transmissão
POST /broadcasts/{broadcastId}/duplicate — copia o público, a mensagem e as definições para uma nova Draft. Tudo o que diz respeito à execução anterior (contadores, lotes, agendamento, estatísticas de resposta) começa do zero.
| Campo | Obrigatório | Descrição |
|---|---|---|
to_channel |
Não | Cria a cópia num canal diferente. É assim que envia a mesma coisa em dois canais — uma transmissão só tem um canal. |
curl -X POST "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456/duplicate?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "to_channel": "sms" }'
Resposta (201)
{ "success": true, "broadcast_id": "bcd999new111", "source_broadcast_id": "bcd123abc456" }
Uma cópia nunca herda uma aprovação ativa do WhatsApp: numa cópia do WhatsApp, o modelo é transferido a necessitar da sua confirmação e, numa cópia para outro canal, é removido e o texto torna-se o conteúdo simples. Copiar para SMS também remove qualquer anexo, uma vez que o SMS não permite o envio de anexos.
Eliminar uma transmissão
DELETE /broadcasts/{broadcastId}
curl -X DELETE "https://api.youraiconnector.com/v1/broadcasts/bcd123abc456?apiKey=YOUR_API_KEY"
Uma difusão Sending ou Scheduled é recusada com 400 — coloque-a primeiro em pausa.
Difusões que espelham uma campanha clássica
As campanhas clássicas que enviam mensagens também aparecem nas Difusões, e a API devolve-as juntamente com as difusões nativas (possuem um source_campaign_id). Comportam-se de forma ligeiramente diferente, porque a campanha continua a estar no comando:
- Editar o público-alvo, a mensagem ou o agendamento funciona e é aplicado na campanha.
- O canal, o agente de resposta, o anexo e todos os contadores de execução são apenas de leitura aqui —
400se tentar alterá-los. Altere-os na campanha. - Iniciar devolve
400, direcionando-o para o editor da campanha. - Pausar e retomar funcionam e atuam sobre a campanha.
- Eliminar devolve
400— elimine a campanha em vez disso, e a sua entrada nas Difusões será removida com ela. - Duplicar cria uma difusão nativa independente, que é a forma suportada de migrar uma campanha comprovada.
Erros
Os pedidos falhados devolvem {"success": false, "error": "<message>"} com estes estados:
| Estado | Significado |
|---|---|
400 |
Algo no pedido ou no estado da difusão está incorreto — um campo em falta, um anexo inválido ou uma ação de iniciar/pausar/retomar/eliminar que não é permitida no estado atual da difusão. A mensagem error indica o motivo. |
401 |
Chave de API em falta ou inválida. |
403 |
O seu plano não inclui acesso à API. |
404 |
Essa difusão não existe na sua conta (ou, na seleção de modelos, esse modelo não existe). |
429 |
Limite de taxa atingido. Aguarde e tente novamente. |
500 |
Algo correu mal do nosso lado. Tente novamente após uma breve espera. |
Próximos passos
- Guia de Difusões — o produto por detrás destes endpoints, incluindo o ritmo e o comportamento de segurança
- API de Contactos — crie a lista para a qual uma difusão é enviada
- API de Modelos — gira os modelos WhatsApp aprovados que pode selecionar
- API de Webhooks — subscreva
Broadcast StartedeBroadcast Completedem vez de consultar