Reivindique sua primeira caixa de correio de agente
Este guia completa uma conversa bidirecional: reivindique uma caixa de entrada no inbox.ai, receba uma mensagem em uma conversa, leia e responda. Você não precisa verificar um domínio nem manter um servidor de e-mail.
1. Crie uma chave API
No painel, acesse Developers > API keys e crie uma chave. No grupo Email, ative os escopos mailbox e mailbox_management. As chaves têm o formato bk_us1_... ou bk_eu1_...; a região no prefixo seleciona o host API.
Exemplo de código
export BIRD_API_KEY="bk_us1_..."2. Reivindique uma caixa de correio
Crie uma caixa de correio no domínio compartilhado inbox.ai. Omita a parte local e Bird gera um endereço disponível. A política de recebimento open aceita e-mails, a menos que uma regra de recebimento os bloqueie.
const mailbox = await bird.email.mailboxes.create({ display_name: "Support" });
console.log(mailbox.address); // "abc123@inbox.ai"mailbox = client.email.mailboxes.create(display_name="Acme Support")
print(mailbox.id)mailbox, err := client.Email.Mailboxes.Create(context.Background(), bird.EmailMailboxesCreateParams{
DisplayName: bird.Ptr("Support"),
})
if err != nil {
log.Fatal(err)
}
fmt.Println(mailbox.Id, *mailbox.Address)$mailbox = $bird->email->mailboxes->create(
(new MailboxCreate())
->setDisplayName('Acme Support'),
);
echo $mailbox->getId(), ' ', $mailbox->getAddress();bird email mailboxes create \
--display-name 'My Agent' \
--receive-policy opencurl -X POST "https://us1.platform.bird.com/v1/email/mailboxes" \
-H "Authorization: Bearer $BIRD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"display_name": "My Agent",
"receive_policy": "open"
}'A resposta contém o id da caixa de correio e o address reivindicado para você. Envie um e-mail para esse endereço a partir de qualquer cliente de e-mail para dar ao próximo passo algo para ler.
3. Leia a conversa
E-mails recebidos se tornam uma conversa na caixa de correio. Liste as conversas e depois leia as mensagens da primeira.

for await (const thread of bird.email.threads.list({ mailbox_id: "mbx_01abc" })) {
console.log(thread.id, thread.subject);
}for thread in client.email.threads.list(mailbox_id="mbx_01krdgeqcxet5s7t44vh8rt9mg"):
print(thread.id, thread.subject)for thread, err := range client.Email.Threads.List(context.Background(), bird.EmailThreadsListParams{}) {
if err != nil {
log.Fatal(err)
}
fmt.Println(thread.Id)
}foreach ($bird->email->threads->list(['mailbox_id' => 'mbx_01krdgeqcxet5s7t44vh8rt9mg']) as $thread) {
echo $thread->getId(), ' ', $thread->getSubject(), "\n";
}bird email threads listcurl -X GET "https://{region}.platform.bird.com/v1/email/threads" \
-H "Authorization: Bearer $TOKEN" \
--url-query "label=urgent" \
--url-query "participant=billing@acme.com" \
--url-query "subject=quarterly invoice" \
--url-query "limit=25"Em seguida, leia as mensagens dessa conversa:
for await (const msg of bird.email.threads.messages.list("thr_01abc")) {
console.log(msg.id, msg.direction);
}for message in client.email.threads.messages.list("thr_01krdgeqcxet5s7t44vh8rt9mg"):
print(message.id, message.subject)for msg, err := range client.Email.Threads.Messages.List(context.Background(), "thr_123", bird.EmailThreadsMessagesListParams{}) {
if err != nil {
log.Fatal(err)
}
fmt.Println(msg.Id, msg.Direction)
}foreach ($bird->email->threads->messages->list('thr_01krdgeqcxet5s7t44vh8rt9mg') as $message) {
echo $message->getId(), ' ', $message->getDirection(), "\n";
}bird email threads messages list <thread-id>curl -X GET "https://{region}.platform.bird.com/v1/email/threads/{thread_id}/messages" \
-H "Authorization: Bearer $TOKEN" \
--url-query "label=unread" \
--url-query "limit=25"Cada mensagem carrega sua direção (inbound) e seu id (uma mensagem recebida tem o prefixo rem_). Adicione include=extracted_text para incluir inline o corpo sem citações: o conteúdo novo, sem o histórico citado que um agente precisaria remover manualmente.
Para evitar polling, registre-se no webhook email_mailbox.message_received. Ele dispara quando uma mensagem recebida chega à caixa de entrada. Consulte a referência de eventos.
4. Responda
Responda à mensagem recebida. Use o ID rem_ do passo 3. A resposta permanece na mesma conversa e é enviada do endereço da sua caixa de correio:
const reply = await bird.email.threads.messages.reply("thr_01abc", "rem_01xyz", {
text: "Thanks for reaching out!",
});
console.log(reply.id);reply = client.email.threads.messages.reply(
"thr_01krdgeqcxet5s7t44vh8rt9mg", "rem_01krdgeqcxet5s7t44vh8rt9mg",
text="Thanks for reaching out!",
)
print(reply.id)reply, err := client.Email.Threads.Messages.Reply(context.Background(), "thr_123", "rem_456", bird.EmailThreadsMessagesReplyParams{
Text: bird.Ptr("Thanks for reaching out!"),
})
if err != nil {
log.Fatal(err)
}
fmt.Println(reply.Id)$reply = $bird->email->threads->messages->reply(
'thr_01krdgeqcxet5s7t44vh8rt9mg',
'rem_01krdgeqcxet5s7t44vh8rt9mg',
(new EmailThreadMessageReplyRequest())
->setText('Thanks, looking into it now.')
->setReplyAll(true),
);
echo $reply->getId();bird email threads messages reply <thread-id> <message-id> \
--text 'Thanks, confirming we received your request.'curl -X POST "https://{region}.platform.bird.com/v1/email/threads/{thread_id}/messages/{message_id}/reply" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"text": "Thanks, confirming we received your request."
}'Agora você pode reivindicar, receber, ler e responder. Para iniciar uma conversa em vez de responder a uma, crie uma nova mensagem na caixa de correio (POST /v1/email/mailboxes/{id}/messages), o que abre uma nova conversa.
Próximos passos
- Caixas de correio de agente: como threads, regras de recebimento, envio e retenção funcionam.
- Servidor MCP: execute o mesmo fluxo a partir de um agente de IA pelo servidor MCP.
- CLI: bird email mailboxes e bird email threads para o terminal.
- Quickstarts SDK: tutoriais SDK em Go, Python e TypeScript.
Recursos relacionados
Continue com a documentação, guias e exemplos sobre este tópico. Os recursos estão em inglês.