Changelog
Mudanças que quebram uma versão já publicada são anunciadas antes de entrar. Mudanças aditivas — campo novo, endpoint novo, código de erro novo — podem chegar a qualquer momento, então faça parse defensivo: ignore campos que você não reconhece.
Não publicado — primeira entrega
Seção intitulada “Não publicado — primeira entrega”A versão v1 ainda não foi liberada para parceiros. O que segue é a forma da
primeira entrega.
-
O acesso ao produto passa a usar as features persistidas da empresa e as permissões do dono igualmente em contas diretas e parceiras. Ofertas comerciais não revogam features concedidas. Novos tokens exigem a feature do aplicativo; tokens emitidos mantêm a duração normal, com revogação da credencial ainda imediata.
-
A atribuição de reuniões e chamadas segue a empresa padrão atual do dono em contas diretas e parceiras; marcadores históricos do evento não fixam a empresa. Permanecem os limites da empresa da credencial e de visibilidade. O WhatsApp usa a empresa salva da sessão de forma uniforme; sessões sem empresa mantêm sua resolução legada autorizada.
-
Nomes de templates de reunião fora do escopo da empresa atual passam a usar o rótulo estável
Template; respostas históricas e referências de template restritas à empresa continuam disponíveis. Nomes de templates pessoais e atualmente autorizados são preservados. -
Respostas e visibilidade por origem do WhatsApp incluem
umbler_talkeantonella, junto de WhatsApp Web e RD Conversas, respeitando a integração habilitada na conta e as permissões do dono. -
O metadata do recurso protegido do OAuth passa a nomear o recurso como
MCP serveremresource_name, e a página de erro e os textos deerror_descriptiondo/oauth/authorizedeixam de citar uma marca.
Ferramentas
- Um servidor MCP oficial acompanha a v1:
@salesbud/mcpno npm, uma tool por operação pública de leitura, para Claude Desktop, Claude Code e Cursor. Ele é cliente desta API e não acrescenta capacidade nenhuma. Veja Servidor MCP. - Servidor MCP 0.2.0: novas tools
list_accounts,list_teamselist_tags; as tools de listagem aceitam os filtros novos; o texto das listagens mostra todas as contas de cada registro, até três (o nome, senão o domínio), inclusive nas conversas de e-mail, que antes saíam com a conta em branco. - Servidor MCP:
get_api_contextdiz se a credencial é da empresa ou de um usuário e mostra o dono. - Servidor MCP 0.3.0: autentica com OAuth (Bearer), para que o Claude e o ChatGPT
conectem fazendo a pessoa entrar. Sem credencial,
POST /mcpresponde401com um challengeWWW-Authenticatecujoresource_metadataaponta para/.well-known/oauth-protected-resource. Token inválido, expirado ou revogado vira um pedido para reconectar, e uma conexão que aguarda aprovação do administrador é descrita assim pelas tools. Os headers fixosX-Client-Id/X-Client-Secretcontinuam funcionando. Veja Conectar o Claude ou o ChatGPT. - Servidor MCP 0.4.0: novas
find_meetingsefind_calls, que acham os registros de uma conta pelo nome, domínio, CNPJ ou id; uma chamada lê no máximo 30 páginas em 20 segundos e devolve o próprionext_cursorquando um teto a para. Uma chamada que o cliente cancela para as leituras que começou, e todo parâmetro de data declaraformat: "date-time". O texto das respostas das tools que já existiam não muda. Veja Servidor MCP. GET /mcp/toolslista as tools da MCP sem credencial — os mesmos campos dotools/list, maisserverVersion— com cache de cinco minutos. Veja Servidor MCP.- Servidor MCP 0.3.1: toda tool declara
destructiveHint: falseeopenWorldHint: falsejunto dereadOnlyHint: true, para que os assistentes saibam que as tools só leem o workspace Salesbud conectado.
- O Salesbud está no diretório de conectores do Claude: quem usa o Claude conecta pelo diretório, com o conector personalizado como alternativa. Veja Conectar o Claude ou o ChatGPT.
Recursos
- Ligações são coleção própria em
/v1/calls, com identificadorescall_. Um registro capturado por integração de VoIP temobject: "call"; o resto émeeting. Ids não resolvem entre coleções. - As cinco rotas são espelhadas nas duas coleções: listar, obter, transcrição, respostas de template e avaliação geral.
- A ligação não carrega
bot_history: captura de VoIP não tem bot de gravação, então o campo é omitido em vez de voltar vazio, e um schema que valida ligação o recusa.enablement.meeting_typefica e costuma virnull— esse nulo é legítimo, diferente do bot. - Conversas de WhatsApp dos vendedores da empresa são uma coleção em
/v1/whatsapp, com identificadoreswa_e mensagenswamsg_, atrás dewhatsapp.read(metadado) ewhatsapp.content.read(texto sanitizado, metadado de mídia, transcrição de áudio).last_message_atsó anda com mensagem nova, então releia as mensagens para ver edições e apagamentos; mensagem apagada fica como lápide. Filtros de data comparam em segundos inteiros. Veja WhatsApp. - Adicionados
GET /v1/accounts,GET /v1/teamseGET /v1/tags: catálogos paginados das contas (buscáveis por nome ou domínio comq, de 2 a 100 caracteres), times e tags da própria empresa, com os ids opacos que os filtros das listagens aceitam. Contas sem domínio utilizável e tags com nome vazio não são listadas. - As referências de conta em reuniões, ligações, e-mails e conversas de WhatsApp
agora trazem
name(nullquando a conta ainda não tem nome).
Erros
- O envelope de erro é
{ type, title, detail, code, request_id }. Todo campo é snake_case; o status HTTP fica na status line e não se repete no corpo. Ramifique pelocode. POST /oauth/tokenmantém o formato de erro do OAuth 2.0 exigido pela RFC 6749 §5.2.account_id,team_idoutag_idmalformado,score_minouscore_maxque não seja inteiro de 0 a 10,score_minmaior quescore_max, ouqfora de 2 a 100 caracteres éINVALID_FILTER. Id bem formado que a empresa não possui devolve página vazia, não erro. Reusar um cursor com outro filtro éINVALID_CURSOR.POST /oauth/tokenrespondeinvalid_clientcom o error_description “The credential has no active owner.” para a credencial de usuário cujo dono não é mais membro ativo da empresa. Credenciais de usuário não trazem outro código de erro: recurso fora da visão do dono é404.- Erro novo
403 API_CLIENT_PENDING_APPROVAL(“The API client is waiting for administrator approval.”): o token é de uma conexão que ainda aguarda aprovação do administrador. - O
403 API_ACCESS_DISABLEDjá existente (a empresa não tem acesso à API) agora está documentado emPOST /oauth/token. Ele usa o envelope de erro acima, não o formato de erro OAuth.
Paginação e filtros
- Os cursores são assinados e ordenados por id crescente; eles amarram os filtros da requisição que os gerou.
updated_after,updated_beforeesnapshot_atforam removidos. Sem carimbo dedicado de visibilidade não há sync incremental honesto; reconsulte por período. Oupdated_atcontinua nas respostas, como informativo.- Os filtros de data são
meeting_afteremeeting_before. Versões anteriores também aceitavammeeting_at_fromemeeting_at_to; eles nunca chegaram a parceiro e foram removidos, em vez de nascerem descontinuados. - Adicionados
account_ideteam_idem/v1/meetings,/v1/calls,/v1/emailse/v1/whatsapp, etag_id,score_minescore_maxem/v1/meetingse/v1/calls. Veja Filtrar por conta, time, tag e nota. team_idsignifica os vendedores cujo time padrão é aquele: um vendedor em vários times conta só para o time padrão, então as reuniões, ligações e conversas de WhatsApp de um vendedor caem em no máximo um time. Vendedores sem time e conversas do RD Conversas não pertencem a time nenhum, então somar os times pode ficar abaixo do total sem filtro. A atribuição é a atual, não o time na data do registro. Time sem membros devolve página vazia. Em e-mails, casa com a conversa quando qualquer uma das suas threads está na caixa de um membro do time, então uma conversa compartilhada entre times pode aparecer em mais de um. No WhatsApp, cobre só números que um membro do time conectou diretamente; as conversas do RD Conversas não têm dono e ficam de fora quandoteam_idé informado.score_minescore_maxsão inclusivos e contam só avaliações concluídas: uma reunião em reavaliação some da listagem filtrada por nota até a nova avaliação terminar.- Cursores emitidos antes desta mudança continuam válidos: os filtros novos só entram no cursor quando presentes.
Acesso
- A API é gateada pela feature
API_ACCESSda empresa, verificada na emissão de token e na criação de credencial. - Emails e domínios de conta são normalizados para minúsculo em todos os campos, então um endereço pode ser usado como chave de junção independentemente de onde apareça.
- Os catálogos aceitam qualquer escopo de leitura de coleção:
meetings.read,calls.read,emails.readouwhatsapp.read. - Adicionadas as credenciais de usuário: solicitadas por qualquer membro de uma empresa com
API_ACCESSque não aprova credenciais, aprovadas por um administrador, 3 ativas e 1 pendente por usuário em cada empresa, válidas por 30, 90, 180 ou 365 dias contados da aprovação e limitadas ao que o dono vê no Salesbud, inclusive as reuniões compartilhadas com ele. As credenciais de empresa não mudam. Veja Duas espécies de credencial, Solicitando uma credencial de usuário e A credencial de usuário vê o que o dono vê. - Rotacionar uma credencial de usuário, o que só o dono pode fazer, encerra o secret anterior na hora e define uma validade nova.
GET /v1/contextagora devolveclient.kind(companyouuser) eclient.owner, o dono da credencial de usuário (nullna credencial de empresa).- O token de uma credencial de usuário carrega só os escopos que o dono pode usar no momento da emissão, e mudanças nos times, compartilhamentos ou permissões do dono chegam à API em até 60 segundos.
- Com a feature ACCOUNTS desligada, a credencial de usuário recebe
/v1/accountsvazio,accounts: []em reuniões, ligações e conversas de email e WhatsApp, e página vazia ao filtrar poraccount_id. - Login OAuth para conectores:
GET /oauth/authorize, os grantsauthorization_codeerefresh_tokendoPOST /oauth/token(a resposta do token traz umrefresh_tokenrotativo para eles, e o erro OAuthinvalid_granté novo) e metadados de descoberta em/.well-known/oauth-authorization-servere/.well-known/oauth-protected-resource. A conexão é uma credencial de usuário que lê o que a pessoa que entrou vê, aguarda aprovação do administrador quando essa pessoa não aprova credenciais e aparece na tela de credenciais da API com o nome do app. Oclient_credentialsnão mudou. Veja Conectar o Claude ou o ChatGPT. - Os apps da própria Salesbud, como os Colaboradores IA, conectam pelo mesmo login OAuth sob
a feature de colaboradores no lugar do acesso à API, e o
POST /oauth/tokenresponde403 AI_COLLABORATORS_DISABLEDsem ela. A conexão deles nasce ativa, sem aprovação, e fica fora dos limites por usuário. Veja Solicitando uma credencial de usuário. - Novo
POST /oauth/revoke(RFC 7009): um refresh token ou um access token de uma conexão feita com login revoga a conexão inteira, e a resposta é200com corpo vazio mesmo para um token desconhecido. Os metadados do servidor de autorização anunciam a rota emrevocation_endpoint. Veja/oauth/revoke. - Renovar uma conexão que um administrador desativou responde
invalid_grantcom"error_description": "The connection was disabled by a company administrator."; ela volta a renovar quando é reativada. POST /oauth/revokee a revogação pelo dono não transformam mais em revogada uma conexão que um administrador desativou: os refresh tokens acabam e ela continua desativada até um administrador revogá-la.