# Salesbud API — full documentation Generated from https://docs.salesbud.com.br. Every page, in reading order. --- # Salesbud API Source: https://docs.salesbud.com.br/ A meeting recorded by the bot and a call captured from VoIP are different resources, so they live at different paths: `/v1/meetings` and `/v1/calls`. Same shape, own identifiers. A credential belongs to a company, never to a user. Every read is filtered by that company — there is no parameter that widens it. Resources are addressed by opaque, prefixed ids (`mtg_`, `call_`, `usr_`). Internal sequential ids are never exposed. Every page is available as plain Markdown, plus [`llms.txt`](/llms.txt) and [`llms-full.txt`](/llms-full.txt) for tools that read documentation directly. ## Your first request Exchange your credential for an access token, then read a page of meetings. ```bash title="First request" # 1. Get an access token (valid for 1 hour) curl -X POST https://api.salesbud.com.br/oauth/token \ -d 'grant_type=client_credentials' \ -d "client_id=$SALESBUD_CLIENT_ID" \ -d "client_secret=$SALESBUD_CLIENT_SECRET" # 2. Read completed meetings from a period curl "https://api.salesbud.com.br/v1/meetings?meeting_after=2026-01-01T00:00:00Z&limit=50" \ -H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN" ``` The response is a page of meetings plus a cursor: ```json title="200 OK" { "data": [ { "id": "mtg_H9_chV2YG6UGE0n31AqvDQ", "object": "meeting", "title": "Discovery — Acme", "status": "completed", "type": "video", "audience": "external", "meeting_at": "2026-01-14T13:00:00.000Z", "duration_seconds": 2840, "participants": [{ "email": "buyer@acme.com", "kind": "external" }], "owner": { "id": "usr_CKAyHd20jJb6GGJqhNF9vA", "email": "rep@yourcompany.com" }, "transcript": { "available": true, "status": "completed" } } ], "pagination": { "limit": 50, "has_more": true, "next_cursor": "cur_..." } } ``` ## Where to go next | If you want to… | Read | | --- | --- | | Make your first call end to end | [Quickstart](/get-started/quickstart/) | | Understand credentials, tokens and scopes | [Authentication](/guides/authentication/) | | Know when a record is a `meeting` and when it is a `call` | [Meetings and calls](/guides/meetings-and-calls/) | | Walk a full history safely | [Pagination](/guides/pagination/) | | Handle failures correctly | [Errors](/guides/errors/) | | See every endpoint, field and status | [API reference](/reference/meetings/listmeetings/) | :::note[Access is granted per company] The API is gated by the `API_ACCESS` company feature. If your company does not have it enabled, token issuance fails with `403 API_ACCESS_DISABLED` — talk to your Salesbud contact rather than retrying. ::: --- # The answer object Source: https://docs.salesbud.com.br/objects/answer Returned by the template answer routes, one entry per question of the record's default template.
id
string
object
meeting_answer
question
object
question.id
string
question.text
string
question.type
text · option · multi_select · boolean · number
question.order
integer
answer
string
updated_at
string date-time
object
id
participants
type
enablement.meeting_type
id
string
nullable
object
overall_meeting_evaluation
meeting_id
string
status
not_started · processing · completed · failed
score
integer
nullable
justification
string
nullable
created_at
string date-time
nullable
updated_at
string date-time
nullable
id
string
object
meeting
title
string
status
completed
type
video · audio
audience
internal · external
meeting_at
string date-time
duration_seconds
integer
no_show
boolean
participants
array of object
owner
object
template
object
nullable
tags
array of object
customer_questions
array of object
competitors
array of object
enablement
object
nullable
accounts
array of object
overall_evaluation
object
skill_scores
array of object
transcript
object
created_at
string date-time
updated_at
string date-time
bot_history
array of object
display_name
string
optional
email
string email
optional
phone
string
optional
kind
external
id
string
name
string
email
string email
nullable
team
object
nullable
id
string
name
string
role
participant · leadership · observer
is_default
boolean
id
string
name
string
answers
array of object
field
string
question
string
answer
string
id
string
name
string
question
string
category
string
id
string
name
string
next_steps
string
nullable
meeting_type
qualification · negotiation · proposal · closing · technical_meeting · questions_clarifications
nullable
speaking_duration
object
speaking_duration.users
array of object
speaking_duration.users[].user
object
speaking_duration.users[].duration_seconds
integer
speaking_duration.others_seconds
integer
nullable
id
string
name
string
email
string email
nullable
id
string
domain
string
cnpj
string
nullable
user
object
skill
object
skill.id
string
skill.name
string
score
integer
justification
string
nullable
code
string
nullable
subcode
string
nullable
occurred_at
string date-time
limit
integer
has_more
boolean
next_cursor
string
nullable
object
transcript
meeting_id
string
available
true · false
status
completed · not_started · processing · failed
variant
enhanced · original
nullable
utterances
array of object
created_at
string date-time
nullable
updated_at
string date-time
nullable
speaker
string
nullable
text
string
start_ms
integer
end_ms
integer
{"/oauth/token"}
### Authorization
No authentication.
### Example request
```bash
curl -X POST https://api.salesbud.com.br/oauth/token \
-d 'grant_type=client_credentials' \
-d 'client_id=sb_client_...' \
-d 'client_secret=sb_secret_...'
```
### Example response
```json title="200 OK"
{
"access_token": "eyJhbGciOiJSUzI1NiJ9.EXAMPLE_PAYLOAD.EXAMPLE_SIGNATURE",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "meetings.read calls.read transcriptions.read"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Access token issued. |
| `400` | OAuth client-credentials request rejected. |
| `401` | OAuth client authentication failed. |
| `413` | The request body is larger than the accepted limit. |
| `415` | The request media type is not supported by this endpoint. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# Get one completed call
Source: https://docs.salesbud.com.br/reference/calls/getcall
get {"/v1/calls/{call_id}"}
Returns a single [call object](/objects/call/).
### Authorization
Requires the `calls.read` scope.
### Path parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `call_id` | `string` | Yes | — |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/calls/call_01JEXAMPLE" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": {
"id": "call_ExampleCall01",
"object": "call",
"title": "Call to +55 11 99999-0000",
"status": "completed",
"type": "audio",
"audience": "external",
"meeting_at": "2026-01-15T18:28:01.000Z",
"duration_seconds": 714,
"no_show": false,
"participants": [
{
"phone": "+5511999990000",
"kind": "external"
}
],
"owner": {
"id": "usr_ExampleOwner01",
"name": "Example Rep",
"email": "rep@example.com",
"team": {
"id": "team_ExampleTeam01",
"name": "Inside Sales",
"role": "participant",
"is_default": true
}
},
"template": {
"id": "tpl_ExampleTemplate01",
"name": "Discovery script",
"answers": [
{
"field": "qst_ExampleQuestion01",
"question": "What pains did the customer describe?",
"answer": "Wants a demo before renewing the current contract."
}
]
},
"tags": [],
"customer_questions": [],
"competitors": [],
"enablement": {
"next_steps": "Online meeting booked for Thursday at 13:30; send the invite today.",
"meeting_type": null,
"speaking_duration": {
"users": [],
"others_seconds": 677
}
},
"accounts": [],
"overall_evaluation": {
"status": "not_started",
"justification": null
},
"skill_scores": [],
"transcript": {
"available": false,
"status": "not_started"
},
"created_at": "2026-01-15T19:22:08.000Z",
"updated_at": "2026-01-15T19:22:53.000Z"
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Company-scoped call. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# List the default template answers for a call
Source: https://docs.salesbud.com.br/reference/calls/getcallanswers
get {"/v1/calls/{call_id}/answers"}
Returns a list of [answer objects](/objects/answer/).
### Authorization
Requires the `calls.read` scope.
### Path parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `call_id` | `string` | Yes | — |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/calls/call_01JEXAMPLE/answers" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": [
{
"id": "ans_ExampleAnswer01",
"object": "meeting_answer",
"question": {
"id": "qst_ExampleQuestion01",
"text": "What pains did the customer describe?",
"type": "text",
"order": 1
},
"answer": "Manual CRM entry after every call, about two hours a day.",
"updated_at": "2026-01-14T14:10:43.000Z"
}
],
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Answers generated for the call owner context. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# Get a call transcript
Source: https://docs.salesbud.com.br/reference/calls/getcalltranscript
get {"/v1/calls/{call_id}/transcript"}
Returns the enhanced transcript when available, otherwise the original transcript. An unavailable transcript is represented by a successful response with available set to false and its current processing status.
Returns a single [transcript object](/objects/transcript/).
### Authorization
Requires the `calls.read` and `transcriptions.read` scopes together.
### Path parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `call_id` | `string` | Yes | — |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/calls/call_01JEXAMPLE/transcript" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": {
"object": "transcript",
"meeting_id": "call_ExampleCall01",
"available": false,
"status": "processing",
"variant": null,
"utterances": [],
"created_at": null,
"updated_at": null
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Company-scoped call transcript. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# Get the overall call evaluation
Source: https://docs.salesbud.com.br/reference/calls/getoverallcallevaluation
get {"/v1/calls/{call_id}/evaluations/overall"}
Returns a single [evaluation object](/objects/evaluation/).
### Authorization
Requires the `calls.read` scope.
### Path parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `call_id` | `string` | Yes | — |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/calls/call_01JEXAMPLE/evaluations/overall" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": {
"id": null,
"object": "overall_meeting_evaluation",
"meeting_id": "call_ExampleCall01",
"status": "not_started",
"score": null,
"justification": null,
"created_at": null,
"updated_at": null
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Overall evaluation state and result. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# List completed calls
Source: https://docs.salesbud.com.br/reference/calls/listcalls
get {"/v1/calls"}
Calls are the records captured from a VoIP integration, addressed by their own `call_` identifiers. They answer the same five routes as meetings and carry the same fields except `bot_history`: a VoIP capture has no recording bot, so the field is absent, not empty.
Returns a list of [call objects](/objects/call/).
### Authorization
Requires the `calls.read` scope.
### Query parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | `integer` | No | Records per page, 1 to 100. A page may return fewer than this while has_more is still true; drive the loop by has_more, not by the size of data. |
| `cursor` | `string` | No | Signed cursor returned by the previous page. |
| `created_after` | `string date-time` | No | Return records created after this instant. |
| `created_before` | `string date-time` | No | Return records created before this instant. |
| `meeting_after` | `string date-time` | No | Return records whose event instant is after this value. |
| `meeting_before` | `string date-time` | No | Return records whose event instant is before this value. |
| `owner_email` | `string email` | No | Exact case-insensitive owner email match. |
| `type` | `video` · `audio` | No | Media the record was captured as. Independent of the resource kind: a call can be video and a meeting can be audio. |
| `audience` | `internal` · `external` | No | Whether the record had participants from outside the company (external) or only internal ones. |
| `has_transcript` | `boolean` | No | Filter by existence of a transcript resource. |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/calls?limit=...&cursor=..." \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": [
{
"id": "call_ExampleCall01",
"object": "call",
"title": "Call to +55 11 99999-0000",
"status": "completed",
"type": "audio",
"audience": "external",
"meeting_at": "2026-01-15T18:28:01.000Z",
"duration_seconds": 714,
"no_show": false,
"participants": [
{
"phone": "+5511999990000",
"kind": "external"
}
],
"owner": {
"id": "usr_ExampleOwner01",
"name": "Example Rep",
"email": "rep@example.com",
"team": {
"id": "team_ExampleTeam01",
"name": "Inside Sales",
"role": "participant",
"is_default": true
}
},
"template": {
"id": "tpl_ExampleTemplate01",
"name": "Discovery script",
"answers": [
{
"field": "qst_ExampleQuestion01",
"question": "What pains did the customer describe?",
"answer": "Wants a demo before renewing the current contract."
}
]
},
"tags": [],
"customer_questions": [],
"competitors": [],
"enablement": {
"next_steps": "Online meeting booked for Thursday at 13:30; send the invite today.",
"meeting_type": null,
"speaking_duration": {
"users": [],
"others_seconds": 677
}
},
"accounts": [],
"overall_evaluation": {
"status": "not_started",
"justification": null
},
"skill_scores": [],
"transcript": {
"available": false,
"status": "not_started"
},
"created_at": "2026-01-15T19:22:08.000Z",
"updated_at": "2026-01-15T19:22:53.000Z"
}
],
"pagination": {
"limit": 50,
"has_more": true,
"next_cursor": "cur_ExampleCursor02"
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Company-scoped call page. |
| `400` | Invalid request. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# Get the authenticated integration context
Source: https://docs.salesbud.com.br/reference/context/getapicontext
get {"/v1/context"}
### Authorization
No authentication.
### Example request
```bash
curl "https://api.salesbud.com.br/v1/context" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": {
"object": "api_context",
"client": {
"id": "sb_client_ExampleClient01",
"name": "acme-sync"
},
"company": {
"id": "cmp_ExampleCompany01",
"name": "Example Company"
},
"scopes": [
"meetings.read",
"calls.read",
"transcriptions.read"
],
"rate_limit": {
"requests_per_minute": 120
}
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | API client, company, scopes and rate-limit context. |
| `401` | Missing or invalid credentials. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# Get an email conversation
Source: https://docs.salesbud.com.br/reference/emails/getemail
get {"/v1/emails/{email_id}"}
Conversation metadata only. An `eml_` id issued to another company, or any id with a different prefix, is a 404, not a hint.
### Authorization
Requires the `emails.read` scope.
### Path parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `email_id` | `string` | Yes | — |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/emails/mtg_01JEXAMPLE" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": {
"id": "eml_01JEXAMPLE",
"object": "email_conversation",
"subject": "Assunto de exemplo",
"first_message_at": "2026-01-10T12:00:00.000Z",
"last_message_at": "2026-01-12T15:30:00.000Z",
"message_count": 3,
"has_attachments": true,
"last_message_direction": "inbound",
"participants": [
{
"address": "vendedora@example.com",
"name": "Vendedora Exemplo",
"internal": true
},
{
"address": "cliente@example.net",
"name": "Cliente Exemplo",
"internal": false
}
],
"mailboxes": [
{
"address": "vendedora@example.com",
"owner": {
"id": "usr_01JEXAMPLE",
"name": "Vendedora Exemplo",
"email": "vendedora@example.com"
}
},
{
"address": "vendas@example.com",
"owner": null
}
],
"accounts": [
{
"id": "acc_01JEXAMPLE",
"domain": "example.net",
"cnpj": "00.000.000/0001-00"
}
]
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Company-scoped email conversation. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# List the messages of an email conversation
Source: https://docs.salesbud.com.br/reference/emails/listemailmessages
get {"/v1/emails/{email_id}/messages"}
Messages in the order they were sent, oldest first, with plain-text bodies and attachment metadata (no attachment content). Governed by the `email_content` rate-limit policy in addition to the client and company policies. The cursor is bound to the conversation.
### Authorization
Requires the `emails.read` and `emails.content.read` scopes together.
### Path parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `email_id` | `string` | Yes | — |
### Query parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | `integer` | No | Records per page, 1 to 100. A page may return fewer than this while has_more is still true; drive the loop by has_more, not by the size of data. |
| `cursor` | `string` | No | Signed cursor returned by the previous page. |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/emails/mtg_01JEXAMPLE/messages?limit=...&cursor=..." \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": [
{
"id": "emsg_01JEXAMPLE",
"object": "email_message",
"conversation_id": "eml_01JEXAMPLE",
"sent_at": "2026-01-12T15:30:00.000Z",
"direction": "inbound",
"subject": "Re: Assunto de exemplo",
"snippet": "Trecho de exemplo da mensagem",
"body_text": "Corpo de exemplo da mensagem.\n\nAtenciosamente,\nCliente Exemplo",
"from": {
"address": "cliente@example.net",
"name": "Cliente Exemplo",
"internal": false
},
"to": [
{
"address": "vendedora@example.com",
"name": "Vendedora Exemplo",
"internal": true
}
],
"cc": [
{
"address": "financeiro@example.net",
"name": null,
"internal": false
}
],
"attachments": [
{
"filename": "exemplo.pdf",
"mime_type": "application/pdf",
"size_bytes": 182400
}
]
}
],
"pagination": {
"limit": 50,
"has_more": false,
"next_cursor": null
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Company-scoped email message page. |
| `400` | Invalid request. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# List email conversations
Source: https://docs.salesbud.com.br/reference/emails/listemails
get {"/v1/emails"}
Conversations are deduplicated across every mailbox connected to the company: two sellers on the same thread yield one conversation with two mailboxes. Ordered by `last_message_at` ascending (oldest activity first); pages forward with a signed keyset cursor. Message bodies live under `/v1/emails/{email_id}/messages` and need `emails.content.read`.
### Authorization
Requires the `emails.read` scope.
### Query parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | `integer` | No | Records per page, 1 to 100. A page may return fewer than this while has_more is still true; drive the loop by has_more, not by the size of data. |
| `cursor` | `string` | No | Signed cursor returned by the previous page. |
| `last_message_after` | `string date-time` | No | Return conversations whose latest message is after this instant. Filters on activity, not on record changes: a conversation that gains a message moves forward and will be seen again. |
| `last_message_before` | `string date-time` | No | Return conversations whose latest message is before this instant. |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/emails?limit=...&cursor=..." \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": [
{
"id": "eml_01JEXAMPLE",
"object": "email_conversation",
"subject": "Assunto de exemplo",
"first_message_at": "2026-01-10T12:00:00.000Z",
"last_message_at": "2026-01-12T15:30:00.000Z",
"message_count": 3,
"has_attachments": true,
"last_message_direction": "inbound",
"participants": [
{
"address": "vendedora@example.com",
"name": "Vendedora Exemplo",
"internal": true
},
{
"address": "cliente@example.net",
"name": "Cliente Exemplo",
"internal": false
}
],
"mailboxes": [
{
"address": "vendedora@example.com",
"owner": {
"id": "usr_01JEXAMPLE",
"name": "Vendedora Exemplo",
"email": "vendedora@example.com"
}
},
{
"address": "vendas@example.com",
"owner": null
}
],
"accounts": [
{
"id": "acc_01JEXAMPLE",
"domain": "example.net",
"cnpj": "00.000.000/0001-00"
}
]
}
],
"pagination": {
"limit": 50,
"has_more": true,
"next_cursor": "cur_ExampleCursor03"
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Company-scoped email conversation page. |
| `400` | Invalid request. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# Get one completed meeting
Source: https://docs.salesbud.com.br/reference/meetings/getmeeting
get {"/v1/meetings/{meeting_id}"}
Returns a single [meeting object](/objects/meeting/).
### Authorization
Requires the `meetings.read` scope.
### Path parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `meeting_id` | `string` | Yes | — |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/meetings/mtg_01JEXAMPLE" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": {
"id": "mtg_ExampleMeeting01",
"object": "meeting",
"title": "Discovery - Acme",
"status": "completed",
"type": "video",
"audience": "external",
"meeting_at": "2026-01-14T13:00:00.000Z",
"duration_seconds": 2840,
"no_show": false,
"participants": [
{
"display_name": "Example Buyer",
"email": "buyer@example.com",
"kind": "external"
},
{
"email": "procurement@example.com",
"kind": "external"
}
],
"owner": {
"id": "usr_ExampleOwner01",
"name": "Example Rep",
"email": "rep@example.com",
"team": {
"id": "team_ExampleTeam01",
"name": "Inside Sales",
"role": "participant",
"is_default": true
}
},
"template": {
"id": "tpl_ExampleTemplate01",
"name": "Discovery script",
"answers": [
{
"field": "qst_ExampleQuestion01",
"question": "What pains did the customer describe?",
"answer": "Manual CRM entry after every call, about two hours a day."
}
]
},
"tags": [
{
"id": "tag_ExampleTag01",
"name": "Enterprise"
}
],
"customer_questions": [
{
"question": "Does it integrate with our CRM?",
"category": "integrations"
}
],
"competitors": [
{
"id": "ctr_ExampleCompetitor01",
"name": "Example CRM"
}
],
"enablement": {
"next_steps": "Send the proposal by Friday covering 5,400 seats.",
"meeting_type": "qualification",
"speaking_duration": {
"users": [
{
"user": {
"id": "usr_ExampleOwner01",
"name": "Example Rep",
"email": "rep@example.com"
},
"duration_seconds": 1760
}
],
"others_seconds": 1080
}
},
"accounts": [
{
"id": "acc_ExampleAccount01",
"domain": "acme.example.com",
"cnpj": "12345678000199"
}
],
"overall_evaluation": {
"status": "completed",
"justification": "Strong discovery, weak on next steps."
},
"skill_scores": [],
"bot_history": [],
"transcript": {
"available": true,
"status": "completed"
},
"created_at": "2026-01-14T12:58:47.000Z",
"updated_at": "2026-01-14T14:10:43.000Z"
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Company-scoped meeting. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# List the default template answers for a meeting
Source: https://docs.salesbud.com.br/reference/meetings/getmeetinganswers
get {"/v1/meetings/{meeting_id}/answers"}
Returns a list of [answer objects](/objects/answer/).
### Authorization
Requires the `meetings.read` scope.
### Path parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `meeting_id` | `string` | Yes | — |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/meetings/mtg_01JEXAMPLE/answers" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": [
{
"id": "ans_ExampleAnswer01",
"object": "meeting_answer",
"question": {
"id": "qst_ExampleQuestion01",
"text": "What pains did the customer describe?",
"type": "text",
"order": 1
},
"answer": "Manual CRM entry after every call, about two hours a day.",
"updated_at": "2026-01-14T14:10:43.000Z"
}
],
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Answers generated for the meeting owner context. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# Get a meeting transcript
Source: https://docs.salesbud.com.br/reference/meetings/getmeetingtranscript
get {"/v1/meetings/{meeting_id}/transcript"}
Returns the enhanced transcript when available, otherwise the original transcript. An unavailable transcript is represented by a successful response with available set to false and its current processing status.
Returns a single [transcript object](/objects/transcript/).
### Authorization
Requires the `meetings.read` and `transcriptions.read` scopes together.
### Path parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `meeting_id` | `string` | Yes | — |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/meetings/mtg_01JEXAMPLE/transcript" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": {
"object": "transcript",
"meeting_id": "mtg_ExampleMeeting01",
"available": true,
"status": "completed",
"variant": "enhanced",
"utterances": [
{
"speaker": "Example Rep",
"text": "Walk me through how the team logs a call today.",
"start_ms": 12400,
"end_ms": 16800
},
{
"speaker": "buyer@example.com",
"text": "Manually, right after. It costs us about two hours a day.",
"start_ms": 17200,
"end_ms": 23900
}
],
"created_at": "2026-01-14T14:02:00.000Z",
"updated_at": "2026-01-14T14:09:12.000Z"
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Company-scoped meeting transcript. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# Get the overall meeting evaluation
Source: https://docs.salesbud.com.br/reference/meetings/getoverallmeetingevaluation
get {"/v1/meetings/{meeting_id}/evaluations/overall"}
Returns a single [evaluation object](/objects/evaluation/).
### Authorization
Requires the `meetings.read` scope.
### Path parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `meeting_id` | `string` | Yes | — |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/meetings/mtg_01JEXAMPLE/evaluations/overall" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": {
"id": "evl_ExampleEvaluation01",
"object": "overall_meeting_evaluation",
"meeting_id": "mtg_ExampleMeeting01",
"status": "completed",
"score": 8,
"justification": "Strong discovery, weak on next steps.",
"created_at": "2026-01-14T14:05:00.000Z",
"updated_at": "2026-01-14T14:10:43.000Z"
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Overall evaluation state and result. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# List completed meetings
Source: https://docs.salesbud.com.br/reference/meetings/listmeetings
get {"/v1/meetings"}
Returns a list of [meeting objects](/objects/meeting/).
### Authorization
Requires the `meetings.read` scope.
### Query parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | `integer` | No | Records per page, 1 to 100. A page may return fewer than this while has_more is still true; drive the loop by has_more, not by the size of data. |
| `cursor` | `string` | No | Signed cursor returned by the previous page. |
| `created_after` | `string date-time` | No | Return records created after this instant. |
| `created_before` | `string date-time` | No | Return records created before this instant. |
| `meeting_after` | `string date-time` | No | Return records whose event instant is after this value. |
| `meeting_before` | `string date-time` | No | Return records whose event instant is before this value. |
| `owner_email` | `string email` | No | Exact case-insensitive owner email match. |
| `type` | `video` · `audio` | No | Media the record was captured as. Independent of the resource kind: a call can be video and a meeting can be audio. |
| `audience` | `internal` · `external` | No | Whether the record had participants from outside the company (external) or only internal ones. |
| `has_transcript` | `boolean` | No | Filter by existence of a transcript resource. |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/meetings?limit=...&cursor=..." \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": [
{
"id": "mtg_ExampleMeeting01",
"object": "meeting",
"title": "Discovery - Acme",
"status": "completed",
"type": "video",
"audience": "external",
"meeting_at": "2026-01-14T13:00:00.000Z",
"duration_seconds": 2840,
"no_show": false,
"participants": [
{
"display_name": "Example Buyer",
"email": "buyer@example.com",
"kind": "external"
},
{
"email": "procurement@example.com",
"kind": "external"
}
],
"owner": {
"id": "usr_ExampleOwner01",
"name": "Example Rep",
"email": "rep@example.com",
"team": {
"id": "team_ExampleTeam01",
"name": "Inside Sales",
"role": "participant",
"is_default": true
}
},
"template": {
"id": "tpl_ExampleTemplate01",
"name": "Discovery script",
"answers": [
{
"field": "qst_ExampleQuestion01",
"question": "What pains did the customer describe?",
"answer": "Manual CRM entry after every call, about two hours a day."
}
]
},
"tags": [
{
"id": "tag_ExampleTag01",
"name": "Enterprise"
}
],
"customer_questions": [
{
"question": "Does it integrate with our CRM?",
"category": "integrations"
}
],
"competitors": [
{
"id": "ctr_ExampleCompetitor01",
"name": "Example CRM"
}
],
"enablement": {
"next_steps": "Send the proposal by Friday covering 5,400 seats.",
"meeting_type": "qualification",
"speaking_duration": {
"users": [
{
"user": {
"id": "usr_ExampleOwner01",
"name": "Example Rep",
"email": "rep@example.com"
},
"duration_seconds": 1760
}
],
"others_seconds": 1080
}
},
"accounts": [
{
"id": "acc_ExampleAccount01",
"domain": "acme.example.com",
"cnpj": "12345678000199"
}
],
"overall_evaluation": {
"status": "completed",
"justification": "Strong discovery, weak on next steps."
},
"skill_scores": [],
"bot_history": [],
"transcript": {
"available": true,
"status": "completed"
},
"created_at": "2026-01-14T12:58:47.000Z",
"updated_at": "2026-01-14T14:10:43.000Z"
}
],
"pagination": {
"limit": 50,
"has_more": true,
"next_cursor": "cur_ExampleCursor01"
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Company-scoped meeting page. |
| `400` | Invalid request. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# Get a WhatsApp conversation
Source: https://docs.salesbud.com.br/reference/whatsapp/getwhatsappconversation
get {"/v1/whatsapp/{whatsapp_id}"}
Conversation metadata only: contact, seller, linked accounts and activity instants. A `wa_` id issued to another company, or any id with a different prefix, is a 404, not a hint. A deleted chat keeps answering, with `deleted_at` and `deleted_reason` set.
### Authorization
Requires the `whatsapp.read` scope.
### Path parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `whatsapp_id` | `string` | Yes | — |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/whatsapp/mtg_01JEXAMPLE" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": {
"id": "wa_01JEXAMPLE",
"object": "whatsapp_conversation",
"source": "whatsapp_web",
"is_group": false,
"contact": {
"phone": "+5511999990001",
"name": "Cliente Exemplo"
},
"seller": {
"user": {
"id": "usr_01JEXAMPLE",
"name": "Vendedora Exemplo",
"email": "vendedora@example.com"
},
"phone": "+5511988880001"
},
"accounts": [
{
"id": "acc_01JEXAMPLE",
"domain": "example.net",
"cnpj": "00.000.000/0001-00"
}
],
"first_message_at": "2026-09-10T12:00:00.000Z",
"last_message_at": "2026-09-12T15:30:00.000Z",
"last_message_direction": "inbound",
"deleted_at": null,
"deleted_reason": null
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Company-scoped WhatsApp conversation. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# List WhatsApp conversations
Source: https://docs.salesbud.com.br/reference/whatsapp/listwhatsappconversations
get {"/v1/whatsapp"}
One conversation per chat of a company seller, from WhatsApp Web or RD Conversas. Ordered by `last_message_at` ascending (oldest activity first); pages forward with a signed keyset cursor. `last_message_at` moves only when a message arrives: an edit or a deletion does not move the conversation, so re-read messages to observe them. Message content lives under `/v1/whatsapp/{whatsapp_id}/messages` and needs `whatsapp.content.read`.
### Authorization
Requires the `whatsapp.read` scope.
### Query parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | `integer` | No | Records per page, 1 to 100. A page may return fewer than this while has_more is still true; drive the loop by has_more, not by the size of data. |
| `cursor` | `string` | No | Signed cursor returned by the previous page. |
| `last_message_after` | `string date-time` | No | Return conversations whose latest message is after this instant. Filters on activity, not on record changes: a conversation that gains a message moves forward and will be seen again. |
| `last_message_before` | `string date-time` | No | Return conversations whose latest message is before this instant. |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/whatsapp?limit=...&cursor=..." \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": [
{
"id": "wa_01JEXAMPLE",
"object": "whatsapp_conversation",
"source": "whatsapp_web",
"is_group": false,
"contact": {
"phone": "+5511999990001",
"name": "Cliente Exemplo"
},
"seller": {
"user": {
"id": "usr_01JEXAMPLE",
"name": "Vendedora Exemplo",
"email": "vendedora@example.com"
},
"phone": "+5511988880001"
},
"accounts": [
{
"id": "acc_01JEXAMPLE",
"domain": "example.net",
"cnpj": "00.000.000/0001-00"
}
],
"first_message_at": "2026-09-10T12:00:00.000Z",
"last_message_at": "2026-09-12T15:30:00.000Z",
"last_message_direction": "inbound",
"deleted_at": null,
"deleted_reason": null
},
{
"id": "wa_01JGROUP",
"object": "whatsapp_conversation",
"source": "whatsapp_web",
"is_group": true,
"contact": {
"phone": null,
"name": "Grupo Vendas Exemplo"
},
"seller": {
"user": {
"id": "usr_01JEXAMPLE",
"name": "Vendedora Exemplo",
"email": "vendedora@example.com"
},
"phone": "+5511988880001"
},
"accounts": [],
"first_message_at": "2026-09-11T09:00:00.000Z",
"last_message_at": "2026-09-12T18:00:00.000Z",
"last_message_direction": "outbound",
"deleted_at": null,
"deleted_reason": null
}
],
"pagination": {
"limit": 50,
"has_more": true,
"next_cursor": "cur_ExampleCursor04"
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Company-scoped WhatsApp conversation page. |
| `400` | Invalid request. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# List the messages of a WhatsApp conversation
Source: https://docs.salesbud.com.br/reference/whatsapp/listwhatsappmessages
get {"/v1/whatsapp/{whatsapp_id}/messages"}
Messages in the order they were sent, oldest first, with sanitized text, media metadata (no media content) and the audio transcription when one exists. A message deleted for everyone stays in place as a tombstone with `deleted_at` set and every content field null; an edited message carries its current text and `edited_at`. Governed by the `whatsapp_content` rate-limit policy in addition to the client and company policies. The cursor is a keyset over `(sent_at, id)` bound to the conversation.
### Authorization
Requires the `whatsapp.read` and `whatsapp.content.read` scopes together.
### Path parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `whatsapp_id` | `string` | Yes | — |
### Query parameters
| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | `integer` | No | Records per page, 1 to 100. A page may return fewer than this while has_more is still true; drive the loop by has_more, not by the size of data. |
| `cursor` | `string` | No | Signed cursor returned by the previous page. |
### Example request
```bash
curl "https://api.salesbud.com.br/v1/whatsapp/mtg_01JEXAMPLE/messages?limit=...&cursor=..." \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Example response
```json title="200 OK"
{
"data": [
{
"id": "wamsg_01JEXAMPLE1",
"object": "whatsapp_message",
"conversation_id": "wa_01JEXAMPLE",
"sent_at": "2026-09-12T15:30:00.000Z",
"direction": "inbound",
"author": {
"phone": "+5511999990001",
"name": "Cliente Exemplo"
},
"type": "text",
"text": "Pode me mandar a proposta?",
"media": null,
"transcription": null,
"edited_at": null,
"deleted_at": null,
"deleted_reason": null
},
{
"id": "wamsg_01JEXAMPLE2",
"object": "whatsapp_message",
"conversation_id": "wa_01JEXAMPLE",
"sent_at": "2026-09-12T15:32:00.000Z",
"direction": "outbound",
"author": {
"phone": "+5511988880001",
"name": "Vendedora Exemplo"
},
"type": "audio",
"text": null,
"media": {
"file_name": null,
"mime_type": "audio/ogg; codecs=opus",
"size_bytes": 48213
},
"transcription": "Claro, envio ainda hoje por e-mail.",
"edited_at": null,
"deleted_at": null,
"deleted_reason": null
},
{
"id": "wamsg_01JEXAMPLE3",
"object": "whatsapp_message",
"conversation_id": "wa_01JEXAMPLE",
"sent_at": "2026-09-12T15:35:00.000Z",
"direction": "inbound",
"author": {
"phone": "+5511999990001",
"name": "Cliente Exemplo"
},
"type": "text",
"text": null,
"media": null,
"transcription": null,
"edited_at": null,
"deleted_at": "2026-09-12T15:36:00.000Z",
"deleted_reason": "revoked_for_everyone"
}
],
"pagination": {
"limit": 50,
"has_more": false,
"next_cursor": null
},
"request_id": "req_ExampleRequestId01"
}
```
### Responses
| Status | Description |
| --- | --- |
| `200` | Company-scoped WhatsApp message page. |
| `400` | Invalid request. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
This page is generated from the OpenAPI specification. Do not edit it by hand.
:::
---
# Changelog
Source: https://docs.salesbud.com.br/resources/changelog
Breaking changes to a released version are announced before they ship. Additive
changes — a new field, a new endpoint, a new error code — can arrive at any time,
so parse defensively: ignore fields you do not recognise.
## Unreleased — first delivery
Version `v1` has not been released to partners yet. Everything below is the shape
of the first delivery.
**Tooling**
- An official MCP server ships alongside v1: `@salesbud/mcp` on npm, one tool per
public read operation, for Claude Desktop, Claude Code and Cursor. It is a
client of this API and adds no capability of its own. See
[MCP server](/guides/mcp/).
**Resources**
- Calls are their own collection at `/v1/calls`, with `call_` identifiers. A
record captured from a VoIP integration has `object: "call"`; everything else
is a `meeting`. Ids do not resolve across collections.
- All five routes are mirrored for both collections: list, retrieve, transcript,
template answers and overall evaluation.
- A call does not carry `bot_history` at all: a VoIP capture has no recording bot, so the field
is omitted rather than returned empty, and a schema that validates a call rejects it.
`enablement.meeting_type` stays and is often `null` — that null is legitimate, unlike the bot.
- WhatsApp conversations of the company's sellers are a collection at `/v1/whatsapp`,
with `wa_` identifiers and `wamsg_` messages, behind `whatsapp.read` (metadata) and
`whatsapp.content.read` (sanitized text, media metadata, audio transcriptions).
`last_message_at` moves only on a new message, so re-read messages to observe edits
and deletions; deleted messages stay as tombstones. Date filters compare in whole
seconds. See [WhatsApp](/reference/whatsapp/listwhatsappconversations/).
**Errors**
- The error envelope is `{ type, title, detail, code, request_id }`. Every field is
snake_case; the HTTP status stays in the status line and is not repeated in the body.
Branch on `code`.
- `POST /oauth/token` keeps the OAuth 2.0 error shape required by RFC 6749 §5.2.
**Pagination and filters**
- Cursors are signed and ordered by ascending id; they bind the filters of the
request that produced them.
- `updated_after`, `updated_before` and `snapshot_at` were removed. Without a
dedicated visibility timestamp there is no honest incremental sync; re-query by
period instead. `updated_at` remains in responses as informative only.
- The date filters are `meeting_after` and `meeting_before`. Earlier drafts also accepted
`meeting_at_from` and `meeting_at_to`; those never reached a partner and were removed rather
than shipped as deprecated on day one.
**Access**
- The API is gated by the `API_ACCESS` company feature, checked at token issuance
and at credential creation.
- Emails and account domains are normalised to lower case in every field, so an
address can be used as a join key regardless of where it appears.
---
# For LLMs and agents
Source: https://docs.salesbud.com.br/resources/for-agents
This documentation is published in machine-readable form as well as HTML, so an
agent can consume it without scraping markup.
## Entry points
| File | Contents |
| --- | --- |
| [`/llms.txt`](/llms.txt) | Index: one line per page, with its URL and a one-line summary. Start here. |
| [`/llms-full.txt`](/llms-full.txt) | Every page concatenated as plain Markdown, in reading order. |
| [`/openapi.yaml`](/openapi.yaml) | The normative contract. Everything in the API reference is generated from it. |
The format follows the [llms.txt convention](https://llmstxt.org/).
## Any page as Markdown
Append `.md` to any documentation URL to get its source instead of the rendered
page:
```
https://docs.salesbud.com.br/guides/pagination/ → HTML
https://docs.salesbud.com.br/guides/pagination.md → Markdown
```
Both language versions are available; the pt-BR pages live under `/pt-br/`.
## If you only need to read data from an agent
This API serves an MCP server at `https://api.salesbud.com.br/mcp`, which claude.ai reaches
as a custom connector. It exposes every public read operation as a tool, and
handles token renewal, retries and transcript windowing for you. That is the
shortest path from a credential to an agent reading meetings — see
[MCP server](/guides/mcp/).
Write an HTTP client instead when you are building a service rather than driving
a model.
## If you are generating integration code
Three things are easy to get wrong and worth reading before you write anything:
1. **Loop on `pagination.has_more`, never on `data.length`.** A page can be short
or empty while more data remains. See [Pagination](/guides/pagination/).
2. **Branch on `error.code`, never on `error.detail`.** The detail is human text
and may be reworded. See [Errors](/guides/errors/).
3. **Do not infer the resource kind from `type`.** `object` says whether it is a
`meeting` or a `call`; `type` only says `video` or `audio`, and the two are
independent. See [Meetings and calls](/guides/meetings-and-calls/).
There is no refresh token — renewal is calling `/oauth/token` again. That is a
property of the client-credentials grant, not an omission.
---
# API Salesbud
Source: https://docs.salesbud.com.br/pt-br
Reunião gravada pelo bot e ligação capturada por VoIP são recursos
diferentes, então vivem em caminhos diferentes: `/v1/meetings` e
`/v1/calls`. Mesma forma, identificadores próprios.
A credencial pertence a uma empresa, nunca a um usuário. Toda leitura é
filtrada por ela — não existe parâmetro que amplie esse escopo.
Recursos são endereçados por ids opacos com prefixo (`mtg_`, `call_`,
`usr_`). Ids internos sequenciais nunca são expostos.
Toda página existe em Markdown puro, além de [`llms.txt`](/llms.txt) e
[`llms-full.txt`](/llms-full.txt) para ferramentas que leem documentação
diretamente.
## Sua primeira requisição
Troque a credencial por um token de acesso e leia uma página de reuniões.
```bash title="Primeira requisição"
# 1. Obtenha um token de acesso (vale 1 hora)
curl -X POST https://api.salesbud.com.br/oauth/token \
-d 'grant_type=client_credentials' \
-d "client_id=$SALESBUD_CLIENT_ID" \
-d "client_secret=$SALESBUD_CLIENT_SECRET"
# 2. Leia as reuniões concluídas de um período
curl "https://api.salesbud.com.br/v1/meetings?meeting_after=2026-01-01T00:00:00Z&limit=50" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
A resposta é uma página de reuniões mais um cursor:
```json title="200 OK"
{
"data": [
{
"id": "mtg_H9_chV2YG6UGE0n31AqvDQ",
"object": "meeting",
"title": "Discovery — Acme",
"status": "completed",
"type": "video",
"audience": "external",
"meeting_at": "2026-01-14T13:00:00.000Z",
"duration_seconds": 2840,
"participants": [{ "email": "comprador@acme.com", "kind": "external" }],
"owner": { "id": "usr_CKAyHd20jJb6GGJqhNF9vA", "email": "vendedor@suaempresa.com" },
"transcript": { "available": true, "status": "completed" }
}
],
"pagination": { "limit": 50, "has_more": true, "next_cursor": "cur_..." }
}
```
## Por onde seguir
| Se você quer… | Leia |
| --- | --- |
| Fazer a primeira chamada de ponta a ponta | [Começo rápido](/pt-br/get-started/quickstart/) |
| Entender credenciais, tokens e escopos | [Autenticação](/pt-br/guides/authentication/) |
| Saber quando um registro é `meeting` e quando é `call` | [Reuniões e ligações](/pt-br/guides/meetings-and-calls/) |
| Percorrer todo o histórico com segurança | [Paginação](/pt-br/guides/pagination/) |
| Tratar falhas corretamente | [Erros](/pt-br/guides/errors/) |
| Ver cada endpoint, campo e status | [Referência da API](/pt-br/reference/meetings/listmeetings/) |
:::note[O acesso é liberado por empresa]
A API é gateada pela feature `API_ACCESS` da empresa. Se a sua não tiver a
feature ligada, a emissão de token falha com `403 API_ACCESS_DISABLED` — fale com
seu contato na Salesbud em vez de repetir a chamada.
:::
---
# O objeto resposta
Source: https://docs.salesbud.com.br/pt-br/objects/answer
Devolvido pelas rotas de respostas de template, um item por pergunta do template padrão do registro.
id
string
object
meeting_answer
question
object
question.id
string
question.text
string
question.type
text · option · multi_select · boolean · number
question.order
integer
answer
string
updated_at
string date-time
object
id
participants
type
enablement.meeting_type
id
string
aceita null
object
overall_meeting_evaluation
meeting_id
string
status
not_started · processing · completed · failed
score
integer
aceita null
justification
string
aceita null
created_at
string date-time
aceita null
updated_at
string date-time
aceita null
id
string
object
meeting
title
string
status
completed
type
video · audio
audience
internal · external
meeting_at
string date-time
duration_seconds
integer
no_show
boolean
participants
array of object
owner
object
template
object
aceita null
tags
array of object
customer_questions
array of object
competitors
array of object
enablement
object
aceita null
accounts
array of object
overall_evaluation
object
skill_scores
array of object
transcript
object
created_at
string date-time
updated_at
string date-time
bot_history
array of object
display_name
string
opcional
email
string email
opcional
phone
string
opcional
kind
external
id
string
name
string
email
string email
aceita null
team
object
aceita null
id
string
name
string
role
participant · leadership · observer
is_default
boolean
id
string
name
string
answers
array of object
field
string
question
string
answer
string
id
string
name
string
question
string
category
string
id
string
name
string
next_steps
string
aceita null
meeting_type
qualification · negotiation · proposal · closing · technical_meeting · questions_clarifications
aceita null
speaking_duration
object
speaking_duration.users
array of object
speaking_duration.users[].user
object
speaking_duration.users[].duration_seconds
integer
speaking_duration.others_seconds
integer
aceita null
id
string
name
string
email
string email
aceita null
id
string
domain
string
cnpj
string
aceita null
user
object
skill
object
skill.id
string
skill.name
string
score
integer
justification
string
aceita null
code
string
aceita null
subcode
string
aceita null
occurred_at
string date-time
limit
integer
has_more
boolean
next_cursor
string
aceita null
object
transcript
meeting_id
string
available
true · false
status
completed · not_started · processing · failed
variant
enhanced · original
aceita null
utterances
array of object
created_at
string date-time
aceita null
updated_at
string date-time
aceita null
speaker
string
aceita null
text
string
start_ms
integer
end_ms
integer
{"/oauth/token"}
### Autorização
Sem autenticação.
### Exemplo de requisição
```bash
curl -X POST https://api.salesbud.com.br/oauth/token \
-d 'grant_type=client_credentials' \
-d 'client_id=sb_client_...' \
-d 'client_secret=sb_secret_...'
```
### Exemplo de resposta
```json title="200 OK"
{
"access_token": "eyJhbGciOiJSUzI1NiJ9.EXAMPLE_PAYLOAD.EXAMPLE_SIGNATURE",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "meetings.read calls.read transcriptions.read"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Access token issued. |
| `400` | OAuth client-credentials request rejected. |
| `401` | OAuth client authentication failed. |
| `413` | The request body is larger than the accepted limit. |
| `415` | The request media type is not supported by this endpoint. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# Get one completed call
Source: https://docs.salesbud.com.br/pt-br/reference/calls/getcall
get {"/v1/calls/{call_id}"}
Devolve um [objeto ligação](/pt-br/objects/call/).
### Autorização
Exige o escopo `calls.read`.
### Parâmetros de caminho
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `call_id` | `string` | Sim | — |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/calls/call_01JEXAMPLE" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": {
"id": "call_ExampleCall01",
"object": "call",
"title": "Call to +55 11 99999-0000",
"status": "completed",
"type": "audio",
"audience": "external",
"meeting_at": "2026-01-15T18:28:01.000Z",
"duration_seconds": 714,
"no_show": false,
"participants": [
{
"phone": "+5511999990000",
"kind": "external"
}
],
"owner": {
"id": "usr_ExampleOwner01",
"name": "Example Rep",
"email": "rep@example.com",
"team": {
"id": "team_ExampleTeam01",
"name": "Inside Sales",
"role": "participant",
"is_default": true
}
},
"template": {
"id": "tpl_ExampleTemplate01",
"name": "Discovery script",
"answers": [
{
"field": "qst_ExampleQuestion01",
"question": "What pains did the customer describe?",
"answer": "Wants a demo before renewing the current contract."
}
]
},
"tags": [],
"customer_questions": [],
"competitors": [],
"enablement": {
"next_steps": "Online meeting booked for Thursday at 13:30; send the invite today.",
"meeting_type": null,
"speaking_duration": {
"users": [],
"others_seconds": 677
}
},
"accounts": [],
"overall_evaluation": {
"status": "not_started",
"justification": null
},
"skill_scores": [],
"transcript": {
"available": false,
"status": "not_started"
},
"created_at": "2026-01-15T19:22:08.000Z",
"updated_at": "2026-01-15T19:22:53.000Z"
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Company-scoped call. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# List the default template answers for a call
Source: https://docs.salesbud.com.br/pt-br/reference/calls/getcallanswers
get {"/v1/calls/{call_id}/answers"}
Devolve uma lista de [objetos resposta](/pt-br/objects/answer/).
### Autorização
Exige o escopo `calls.read`.
### Parâmetros de caminho
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `call_id` | `string` | Sim | — |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/calls/call_01JEXAMPLE/answers" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": [
{
"id": "ans_ExampleAnswer01",
"object": "meeting_answer",
"question": {
"id": "qst_ExampleQuestion01",
"text": "What pains did the customer describe?",
"type": "text",
"order": 1
},
"answer": "Manual CRM entry after every call, about two hours a day.",
"updated_at": "2026-01-14T14:10:43.000Z"
}
],
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Answers generated for the call owner context. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# Get a call transcript
Source: https://docs.salesbud.com.br/pt-br/reference/calls/getcalltranscript
get {"/v1/calls/{call_id}/transcript"}
Returns the enhanced transcript when available, otherwise the original transcript. An unavailable transcript is represented by a successful response with available set to false and its current processing status.
Devolve um [objeto transcrição](/pt-br/objects/transcript/).
### Autorização
Exige os escopos `calls.read` e `transcriptions.read` juntos.
### Parâmetros de caminho
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `call_id` | `string` | Sim | — |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/calls/call_01JEXAMPLE/transcript" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": {
"object": "transcript",
"meeting_id": "call_ExampleCall01",
"available": false,
"status": "processing",
"variant": null,
"utterances": [],
"created_at": null,
"updated_at": null
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Company-scoped call transcript. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# Get the overall call evaluation
Source: https://docs.salesbud.com.br/pt-br/reference/calls/getoverallcallevaluation
get {"/v1/calls/{call_id}/evaluations/overall"}
Devolve um [objeto avaliação](/pt-br/objects/evaluation/).
### Autorização
Exige o escopo `calls.read`.
### Parâmetros de caminho
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `call_id` | `string` | Sim | — |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/calls/call_01JEXAMPLE/evaluations/overall" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": {
"id": null,
"object": "overall_meeting_evaluation",
"meeting_id": "call_ExampleCall01",
"status": "not_started",
"score": null,
"justification": null,
"created_at": null,
"updated_at": null
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Overall evaluation state and result. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# List completed calls
Source: https://docs.salesbud.com.br/pt-br/reference/calls/listcalls
get {"/v1/calls"}
Calls are the records captured from a VoIP integration, addressed by their own `call_` identifiers. They answer the same five routes as meetings and carry the same fields except `bot_history`: a VoIP capture has no recording bot, so the field is absent, not empty.
Devolve uma lista de [objetos ligação](/pt-br/objects/call/).
### Autorização
Exige o escopo `calls.read`.
### Parâmetros de query
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `limit` | `integer` | Não | Records per page, 1 to 100. A page may return fewer than this while has_more is still true; drive the loop by has_more, not by the size of data. |
| `cursor` | `string` | Não | Signed cursor returned by the previous page. |
| `created_after` | `string date-time` | Não | Return records created after this instant. |
| `created_before` | `string date-time` | Não | Return records created before this instant. |
| `meeting_after` | `string date-time` | Não | Return records whose event instant is after this value. |
| `meeting_before` | `string date-time` | Não | Return records whose event instant is before this value. |
| `owner_email` | `string email` | Não | Exact case-insensitive owner email match. |
| `type` | `video` · `audio` | Não | Media the record was captured as. Independent of the resource kind: a call can be video and a meeting can be audio. |
| `audience` | `internal` · `external` | Não | Whether the record had participants from outside the company (external) or only internal ones. |
| `has_transcript` | `boolean` | Não | Filter by existence of a transcript resource. |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/calls?limit=...&cursor=..." \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": [
{
"id": "call_ExampleCall01",
"object": "call",
"title": "Call to +55 11 99999-0000",
"status": "completed",
"type": "audio",
"audience": "external",
"meeting_at": "2026-01-15T18:28:01.000Z",
"duration_seconds": 714,
"no_show": false,
"participants": [
{
"phone": "+5511999990000",
"kind": "external"
}
],
"owner": {
"id": "usr_ExampleOwner01",
"name": "Example Rep",
"email": "rep@example.com",
"team": {
"id": "team_ExampleTeam01",
"name": "Inside Sales",
"role": "participant",
"is_default": true
}
},
"template": {
"id": "tpl_ExampleTemplate01",
"name": "Discovery script",
"answers": [
{
"field": "qst_ExampleQuestion01",
"question": "What pains did the customer describe?",
"answer": "Wants a demo before renewing the current contract."
}
]
},
"tags": [],
"customer_questions": [],
"competitors": [],
"enablement": {
"next_steps": "Online meeting booked for Thursday at 13:30; send the invite today.",
"meeting_type": null,
"speaking_duration": {
"users": [],
"others_seconds": 677
}
},
"accounts": [],
"overall_evaluation": {
"status": "not_started",
"justification": null
},
"skill_scores": [],
"transcript": {
"available": false,
"status": "not_started"
},
"created_at": "2026-01-15T19:22:08.000Z",
"updated_at": "2026-01-15T19:22:53.000Z"
}
],
"pagination": {
"limit": 50,
"has_more": true,
"next_cursor": "cur_ExampleCursor02"
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Company-scoped call page. |
| `400` | Invalid request. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# Get the authenticated integration context
Source: https://docs.salesbud.com.br/pt-br/reference/context/getapicontext
get {"/v1/context"}
### Autorização
Sem autenticação.
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/context" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": {
"object": "api_context",
"client": {
"id": "sb_client_ExampleClient01",
"name": "acme-sync"
},
"company": {
"id": "cmp_ExampleCompany01",
"name": "Example Company"
},
"scopes": [
"meetings.read",
"calls.read",
"transcriptions.read"
],
"rate_limit": {
"requests_per_minute": 120
}
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | API client, company, scopes and rate-limit context. |
| `401` | Missing or invalid credentials. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# Get an email conversation
Source: https://docs.salesbud.com.br/pt-br/reference/emails/getemail
get {"/v1/emails/{email_id}"}
Conversation metadata only. An `eml_` id issued to another company, or any id with a different prefix, is a 404, not a hint.
### Autorização
Exige o escopo `emails.read`.
### Parâmetros de caminho
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `email_id` | `string` | Sim | — |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/emails/mtg_01JEXAMPLE" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": {
"id": "eml_01JEXAMPLE",
"object": "email_conversation",
"subject": "Assunto de exemplo",
"first_message_at": "2026-01-10T12:00:00.000Z",
"last_message_at": "2026-01-12T15:30:00.000Z",
"message_count": 3,
"has_attachments": true,
"last_message_direction": "inbound",
"participants": [
{
"address": "vendedora@example.com",
"name": "Vendedora Exemplo",
"internal": true
},
{
"address": "cliente@example.net",
"name": "Cliente Exemplo",
"internal": false
}
],
"mailboxes": [
{
"address": "vendedora@example.com",
"owner": {
"id": "usr_01JEXAMPLE",
"name": "Vendedora Exemplo",
"email": "vendedora@example.com"
}
},
{
"address": "vendas@example.com",
"owner": null
}
],
"accounts": [
{
"id": "acc_01JEXAMPLE",
"domain": "example.net",
"cnpj": "00.000.000/0001-00"
}
]
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Company-scoped email conversation. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# List the messages of an email conversation
Source: https://docs.salesbud.com.br/pt-br/reference/emails/listemailmessages
get {"/v1/emails/{email_id}/messages"}
Messages in the order they were sent, oldest first, with plain-text bodies and attachment metadata (no attachment content). Governed by the `email_content` rate-limit policy in addition to the client and company policies. The cursor is bound to the conversation.
### Autorização
Exige os escopos `emails.read` e `emails.content.read` juntos.
### Parâmetros de caminho
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `email_id` | `string` | Sim | — |
### Parâmetros de query
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `limit` | `integer` | Não | Records per page, 1 to 100. A page may return fewer than this while has_more is still true; drive the loop by has_more, not by the size of data. |
| `cursor` | `string` | Não | Signed cursor returned by the previous page. |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/emails/mtg_01JEXAMPLE/messages?limit=...&cursor=..." \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": [
{
"id": "emsg_01JEXAMPLE",
"object": "email_message",
"conversation_id": "eml_01JEXAMPLE",
"sent_at": "2026-01-12T15:30:00.000Z",
"direction": "inbound",
"subject": "Re: Assunto de exemplo",
"snippet": "Trecho de exemplo da mensagem",
"body_text": "Corpo de exemplo da mensagem.\n\nAtenciosamente,\nCliente Exemplo",
"from": {
"address": "cliente@example.net",
"name": "Cliente Exemplo",
"internal": false
},
"to": [
{
"address": "vendedora@example.com",
"name": "Vendedora Exemplo",
"internal": true
}
],
"cc": [
{
"address": "financeiro@example.net",
"name": null,
"internal": false
}
],
"attachments": [
{
"filename": "exemplo.pdf",
"mime_type": "application/pdf",
"size_bytes": 182400
}
]
}
],
"pagination": {
"limit": 50,
"has_more": false,
"next_cursor": null
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Company-scoped email message page. |
| `400` | Invalid request. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# List email conversations
Source: https://docs.salesbud.com.br/pt-br/reference/emails/listemails
get {"/v1/emails"}
Conversations are deduplicated across every mailbox connected to the company: two sellers on the same thread yield one conversation with two mailboxes. Ordered by `last_message_at` ascending (oldest activity first); pages forward with a signed keyset cursor. Message bodies live under `/v1/emails/{email_id}/messages` and need `emails.content.read`.
### Autorização
Exige o escopo `emails.read`.
### Parâmetros de query
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `limit` | `integer` | Não | Records per page, 1 to 100. A page may return fewer than this while has_more is still true; drive the loop by has_more, not by the size of data. |
| `cursor` | `string` | Não | Signed cursor returned by the previous page. |
| `last_message_after` | `string date-time` | Não | Return conversations whose latest message is after this instant. Filters on activity, not on record changes: a conversation that gains a message moves forward and will be seen again. |
| `last_message_before` | `string date-time` | Não | Return conversations whose latest message is before this instant. |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/emails?limit=...&cursor=..." \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": [
{
"id": "eml_01JEXAMPLE",
"object": "email_conversation",
"subject": "Assunto de exemplo",
"first_message_at": "2026-01-10T12:00:00.000Z",
"last_message_at": "2026-01-12T15:30:00.000Z",
"message_count": 3,
"has_attachments": true,
"last_message_direction": "inbound",
"participants": [
{
"address": "vendedora@example.com",
"name": "Vendedora Exemplo",
"internal": true
},
{
"address": "cliente@example.net",
"name": "Cliente Exemplo",
"internal": false
}
],
"mailboxes": [
{
"address": "vendedora@example.com",
"owner": {
"id": "usr_01JEXAMPLE",
"name": "Vendedora Exemplo",
"email": "vendedora@example.com"
}
},
{
"address": "vendas@example.com",
"owner": null
}
],
"accounts": [
{
"id": "acc_01JEXAMPLE",
"domain": "example.net",
"cnpj": "00.000.000/0001-00"
}
]
}
],
"pagination": {
"limit": 50,
"has_more": true,
"next_cursor": "cur_ExampleCursor03"
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Company-scoped email conversation page. |
| `400` | Invalid request. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# Get one completed meeting
Source: https://docs.salesbud.com.br/pt-br/reference/meetings/getmeeting
get {"/v1/meetings/{meeting_id}"}
Devolve um [objeto reunião](/pt-br/objects/meeting/).
### Autorização
Exige o escopo `meetings.read`.
### Parâmetros de caminho
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `meeting_id` | `string` | Sim | — |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/meetings/mtg_01JEXAMPLE" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": {
"id": "mtg_ExampleMeeting01",
"object": "meeting",
"title": "Discovery - Acme",
"status": "completed",
"type": "video",
"audience": "external",
"meeting_at": "2026-01-14T13:00:00.000Z",
"duration_seconds": 2840,
"no_show": false,
"participants": [
{
"display_name": "Example Buyer",
"email": "buyer@example.com",
"kind": "external"
},
{
"email": "procurement@example.com",
"kind": "external"
}
],
"owner": {
"id": "usr_ExampleOwner01",
"name": "Example Rep",
"email": "rep@example.com",
"team": {
"id": "team_ExampleTeam01",
"name": "Inside Sales",
"role": "participant",
"is_default": true
}
},
"template": {
"id": "tpl_ExampleTemplate01",
"name": "Discovery script",
"answers": [
{
"field": "qst_ExampleQuestion01",
"question": "What pains did the customer describe?",
"answer": "Manual CRM entry after every call, about two hours a day."
}
]
},
"tags": [
{
"id": "tag_ExampleTag01",
"name": "Enterprise"
}
],
"customer_questions": [
{
"question": "Does it integrate with our CRM?",
"category": "integrations"
}
],
"competitors": [
{
"id": "ctr_ExampleCompetitor01",
"name": "Example CRM"
}
],
"enablement": {
"next_steps": "Send the proposal by Friday covering 5,400 seats.",
"meeting_type": "qualification",
"speaking_duration": {
"users": [
{
"user": {
"id": "usr_ExampleOwner01",
"name": "Example Rep",
"email": "rep@example.com"
},
"duration_seconds": 1760
}
],
"others_seconds": 1080
}
},
"accounts": [
{
"id": "acc_ExampleAccount01",
"domain": "acme.example.com",
"cnpj": "12345678000199"
}
],
"overall_evaluation": {
"status": "completed",
"justification": "Strong discovery, weak on next steps."
},
"skill_scores": [],
"bot_history": [],
"transcript": {
"available": true,
"status": "completed"
},
"created_at": "2026-01-14T12:58:47.000Z",
"updated_at": "2026-01-14T14:10:43.000Z"
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Company-scoped meeting. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# List the default template answers for a meeting
Source: https://docs.salesbud.com.br/pt-br/reference/meetings/getmeetinganswers
get {"/v1/meetings/{meeting_id}/answers"}
Devolve uma lista de [objetos resposta](/pt-br/objects/answer/).
### Autorização
Exige o escopo `meetings.read`.
### Parâmetros de caminho
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `meeting_id` | `string` | Sim | — |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/meetings/mtg_01JEXAMPLE/answers" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": [
{
"id": "ans_ExampleAnswer01",
"object": "meeting_answer",
"question": {
"id": "qst_ExampleQuestion01",
"text": "What pains did the customer describe?",
"type": "text",
"order": 1
},
"answer": "Manual CRM entry after every call, about two hours a day.",
"updated_at": "2026-01-14T14:10:43.000Z"
}
],
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Answers generated for the meeting owner context. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# Get a meeting transcript
Source: https://docs.salesbud.com.br/pt-br/reference/meetings/getmeetingtranscript
get {"/v1/meetings/{meeting_id}/transcript"}
Returns the enhanced transcript when available, otherwise the original transcript. An unavailable transcript is represented by a successful response with available set to false and its current processing status.
Devolve um [objeto transcrição](/pt-br/objects/transcript/).
### Autorização
Exige os escopos `meetings.read` e `transcriptions.read` juntos.
### Parâmetros de caminho
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `meeting_id` | `string` | Sim | — |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/meetings/mtg_01JEXAMPLE/transcript" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": {
"object": "transcript",
"meeting_id": "mtg_ExampleMeeting01",
"available": true,
"status": "completed",
"variant": "enhanced",
"utterances": [
{
"speaker": "Example Rep",
"text": "Walk me through how the team logs a call today.",
"start_ms": 12400,
"end_ms": 16800
},
{
"speaker": "buyer@example.com",
"text": "Manually, right after. It costs us about two hours a day.",
"start_ms": 17200,
"end_ms": 23900
}
],
"created_at": "2026-01-14T14:02:00.000Z",
"updated_at": "2026-01-14T14:09:12.000Z"
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Company-scoped meeting transcript. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# Get the overall meeting evaluation
Source: https://docs.salesbud.com.br/pt-br/reference/meetings/getoverallmeetingevaluation
get {"/v1/meetings/{meeting_id}/evaluations/overall"}
Devolve um [objeto avaliação](/pt-br/objects/evaluation/).
### Autorização
Exige o escopo `meetings.read`.
### Parâmetros de caminho
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `meeting_id` | `string` | Sim | — |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/meetings/mtg_01JEXAMPLE/evaluations/overall" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": {
"id": "evl_ExampleEvaluation01",
"object": "overall_meeting_evaluation",
"meeting_id": "mtg_ExampleMeeting01",
"status": "completed",
"score": 8,
"justification": "Strong discovery, weak on next steps.",
"created_at": "2026-01-14T14:05:00.000Z",
"updated_at": "2026-01-14T14:10:43.000Z"
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Overall evaluation state and result. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# List completed meetings
Source: https://docs.salesbud.com.br/pt-br/reference/meetings/listmeetings
get {"/v1/meetings"}
Devolve uma lista de [objetos reunião](/pt-br/objects/meeting/).
### Autorização
Exige o escopo `meetings.read`.
### Parâmetros de query
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `limit` | `integer` | Não | Records per page, 1 to 100. A page may return fewer than this while has_more is still true; drive the loop by has_more, not by the size of data. |
| `cursor` | `string` | Não | Signed cursor returned by the previous page. |
| `created_after` | `string date-time` | Não | Return records created after this instant. |
| `created_before` | `string date-time` | Não | Return records created before this instant. |
| `meeting_after` | `string date-time` | Não | Return records whose event instant is after this value. |
| `meeting_before` | `string date-time` | Não | Return records whose event instant is before this value. |
| `owner_email` | `string email` | Não | Exact case-insensitive owner email match. |
| `type` | `video` · `audio` | Não | Media the record was captured as. Independent of the resource kind: a call can be video and a meeting can be audio. |
| `audience` | `internal` · `external` | Não | Whether the record had participants from outside the company (external) or only internal ones. |
| `has_transcript` | `boolean` | Não | Filter by existence of a transcript resource. |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/meetings?limit=...&cursor=..." \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": [
{
"id": "mtg_ExampleMeeting01",
"object": "meeting",
"title": "Discovery - Acme",
"status": "completed",
"type": "video",
"audience": "external",
"meeting_at": "2026-01-14T13:00:00.000Z",
"duration_seconds": 2840,
"no_show": false,
"participants": [
{
"display_name": "Example Buyer",
"email": "buyer@example.com",
"kind": "external"
},
{
"email": "procurement@example.com",
"kind": "external"
}
],
"owner": {
"id": "usr_ExampleOwner01",
"name": "Example Rep",
"email": "rep@example.com",
"team": {
"id": "team_ExampleTeam01",
"name": "Inside Sales",
"role": "participant",
"is_default": true
}
},
"template": {
"id": "tpl_ExampleTemplate01",
"name": "Discovery script",
"answers": [
{
"field": "qst_ExampleQuestion01",
"question": "What pains did the customer describe?",
"answer": "Manual CRM entry after every call, about two hours a day."
}
]
},
"tags": [
{
"id": "tag_ExampleTag01",
"name": "Enterprise"
}
],
"customer_questions": [
{
"question": "Does it integrate with our CRM?",
"category": "integrations"
}
],
"competitors": [
{
"id": "ctr_ExampleCompetitor01",
"name": "Example CRM"
}
],
"enablement": {
"next_steps": "Send the proposal by Friday covering 5,400 seats.",
"meeting_type": "qualification",
"speaking_duration": {
"users": [
{
"user": {
"id": "usr_ExampleOwner01",
"name": "Example Rep",
"email": "rep@example.com"
},
"duration_seconds": 1760
}
],
"others_seconds": 1080
}
},
"accounts": [
{
"id": "acc_ExampleAccount01",
"domain": "acme.example.com",
"cnpj": "12345678000199"
}
],
"overall_evaluation": {
"status": "completed",
"justification": "Strong discovery, weak on next steps."
},
"skill_scores": [],
"bot_history": [],
"transcript": {
"available": true,
"status": "completed"
},
"created_at": "2026-01-14T12:58:47.000Z",
"updated_at": "2026-01-14T14:10:43.000Z"
}
],
"pagination": {
"limit": 50,
"has_more": true,
"next_cursor": "cur_ExampleCursor01"
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Company-scoped meeting page. |
| `400` | Invalid request. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# Get a WhatsApp conversation
Source: https://docs.salesbud.com.br/pt-br/reference/whatsapp/getwhatsappconversation
get {"/v1/whatsapp/{whatsapp_id}"}
Conversation metadata only: contact, seller, linked accounts and activity instants. A `wa_` id issued to another company, or any id with a different prefix, is a 404, not a hint. A deleted chat keeps answering, with `deleted_at` and `deleted_reason` set.
### Autorização
Exige o escopo `whatsapp.read`.
### Parâmetros de caminho
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `whatsapp_id` | `string` | Sim | — |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/whatsapp/mtg_01JEXAMPLE" \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": {
"id": "wa_01JEXAMPLE",
"object": "whatsapp_conversation",
"source": "whatsapp_web",
"is_group": false,
"contact": {
"phone": "+5511999990001",
"name": "Cliente Exemplo"
},
"seller": {
"user": {
"id": "usr_01JEXAMPLE",
"name": "Vendedora Exemplo",
"email": "vendedora@example.com"
},
"phone": "+5511988880001"
},
"accounts": [
{
"id": "acc_01JEXAMPLE",
"domain": "example.net",
"cnpj": "00.000.000/0001-00"
}
],
"first_message_at": "2026-09-10T12:00:00.000Z",
"last_message_at": "2026-09-12T15:30:00.000Z",
"last_message_direction": "inbound",
"deleted_at": null,
"deleted_reason": null
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Company-scoped WhatsApp conversation. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# List WhatsApp conversations
Source: https://docs.salesbud.com.br/pt-br/reference/whatsapp/listwhatsappconversations
get {"/v1/whatsapp"}
One conversation per chat of a company seller, from WhatsApp Web or RD Conversas. Ordered by `last_message_at` ascending (oldest activity first); pages forward with a signed keyset cursor. `last_message_at` moves only when a message arrives: an edit or a deletion does not move the conversation, so re-read messages to observe them. Message content lives under `/v1/whatsapp/{whatsapp_id}/messages` and needs `whatsapp.content.read`.
### Autorização
Exige o escopo `whatsapp.read`.
### Parâmetros de query
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `limit` | `integer` | Não | Records per page, 1 to 100. A page may return fewer than this while has_more is still true; drive the loop by has_more, not by the size of data. |
| `cursor` | `string` | Não | Signed cursor returned by the previous page. |
| `last_message_after` | `string date-time` | Não | Return conversations whose latest message is after this instant. Filters on activity, not on record changes: a conversation that gains a message moves forward and will be seen again. |
| `last_message_before` | `string date-time` | Não | Return conversations whose latest message is before this instant. |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/whatsapp?limit=...&cursor=..." \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": [
{
"id": "wa_01JEXAMPLE",
"object": "whatsapp_conversation",
"source": "whatsapp_web",
"is_group": false,
"contact": {
"phone": "+5511999990001",
"name": "Cliente Exemplo"
},
"seller": {
"user": {
"id": "usr_01JEXAMPLE",
"name": "Vendedora Exemplo",
"email": "vendedora@example.com"
},
"phone": "+5511988880001"
},
"accounts": [
{
"id": "acc_01JEXAMPLE",
"domain": "example.net",
"cnpj": "00.000.000/0001-00"
}
],
"first_message_at": "2026-09-10T12:00:00.000Z",
"last_message_at": "2026-09-12T15:30:00.000Z",
"last_message_direction": "inbound",
"deleted_at": null,
"deleted_reason": null
},
{
"id": "wa_01JGROUP",
"object": "whatsapp_conversation",
"source": "whatsapp_web",
"is_group": true,
"contact": {
"phone": null,
"name": "Grupo Vendas Exemplo"
},
"seller": {
"user": {
"id": "usr_01JEXAMPLE",
"name": "Vendedora Exemplo",
"email": "vendedora@example.com"
},
"phone": "+5511988880001"
},
"accounts": [],
"first_message_at": "2026-09-11T09:00:00.000Z",
"last_message_at": "2026-09-12T18:00:00.000Z",
"last_message_direction": "outbound",
"deleted_at": null,
"deleted_reason": null
}
],
"pagination": {
"limit": 50,
"has_more": true,
"next_cursor": "cur_ExampleCursor04"
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Company-scoped WhatsApp conversation page. |
| `400` | Invalid request. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# List the messages of a WhatsApp conversation
Source: https://docs.salesbud.com.br/pt-br/reference/whatsapp/listwhatsappmessages
get {"/v1/whatsapp/{whatsapp_id}/messages"}
Messages in the order they were sent, oldest first, with sanitized text, media metadata (no media content) and the audio transcription when one exists. A message deleted for everyone stays in place as a tombstone with `deleted_at` set and every content field null; an edited message carries its current text and `edited_at`. Governed by the `whatsapp_content` rate-limit policy in addition to the client and company policies. The cursor is a keyset over `(sent_at, id)` bound to the conversation.
### Autorização
Exige os escopos `whatsapp.read` e `whatsapp.content.read` juntos.
### Parâmetros de caminho
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `whatsapp_id` | `string` | Sim | — |
### Parâmetros de query
| Nome | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `limit` | `integer` | Não | Records per page, 1 to 100. A page may return fewer than this while has_more is still true; drive the loop by has_more, not by the size of data. |
| `cursor` | `string` | Não | Signed cursor returned by the previous page. |
### Exemplo de requisição
```bash
curl "https://api.salesbud.com.br/v1/whatsapp/mtg_01JEXAMPLE/messages?limit=...&cursor=..." \
-H "Authorization: Bearer $SALESBUD_ACCESS_TOKEN"
```
### Exemplo de resposta
```json title="200 OK"
{
"data": [
{
"id": "wamsg_01JEXAMPLE1",
"object": "whatsapp_message",
"conversation_id": "wa_01JEXAMPLE",
"sent_at": "2026-09-12T15:30:00.000Z",
"direction": "inbound",
"author": {
"phone": "+5511999990001",
"name": "Cliente Exemplo"
},
"type": "text",
"text": "Pode me mandar a proposta?",
"media": null,
"transcription": null,
"edited_at": null,
"deleted_at": null,
"deleted_reason": null
},
{
"id": "wamsg_01JEXAMPLE2",
"object": "whatsapp_message",
"conversation_id": "wa_01JEXAMPLE",
"sent_at": "2026-09-12T15:32:00.000Z",
"direction": "outbound",
"author": {
"phone": "+5511988880001",
"name": "Vendedora Exemplo"
},
"type": "audio",
"text": null,
"media": {
"file_name": null,
"mime_type": "audio/ogg; codecs=opus",
"size_bytes": 48213
},
"transcription": "Claro, envio ainda hoje por e-mail.",
"edited_at": null,
"deleted_at": null,
"deleted_reason": null
},
{
"id": "wamsg_01JEXAMPLE3",
"object": "whatsapp_message",
"conversation_id": "wa_01JEXAMPLE",
"sent_at": "2026-09-12T15:35:00.000Z",
"direction": "inbound",
"author": {
"phone": "+5511999990001",
"name": "Cliente Exemplo"
},
"type": "text",
"text": null,
"media": null,
"transcription": null,
"edited_at": null,
"deleted_at": "2026-09-12T15:36:00.000Z",
"deleted_reason": "revoked_for_everyone"
}
],
"pagination": {
"limit": 50,
"has_more": false,
"next_cursor": null
},
"request_id": "req_ExampleRequestId01"
}
```
### Respostas
| Status | Descrição |
| --- | --- |
| `200` | Company-scoped WhatsApp message page. |
| `400` | Invalid request. |
| `401` | Missing or invalid credentials. |
| `403` | The token does not contain the required scope. |
| `404` | Resource not found in the authenticated company. |
| `429` | Client rate limit exceeded. |
| `503` | A required audit or rate-limit dependency is unavailable. |
:::note
Esta página é gerada a partir da especificação OpenAPI. Não edite à mão.
:::
---
# Changelog
Source: https://docs.salesbud.com.br/pt-br/resources/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
A versão `v1` ainda não foi liberada para parceiros. O que segue é a forma da
primeira entrega.
**Ferramentas**
- Um servidor MCP oficial acompanha a v1: `@salesbud/mcp` no 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](/pt-br/guides/mcp/).
**Recursos**
- Ligações são coleção própria em `/v1/calls`, com identificadores `call_`. Um
registro capturado por integração de VoIP tem `object: "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_type` fica e costuma vir `null` — esse nulo é legítimo, diferente do bot.
- Conversas de WhatsApp dos vendedores da empresa são uma coleção em `/v1/whatsapp`,
com identificadores `wa_` e mensagens `wamsg_`, atrás de `whatsapp.read` (metadado) e
`whatsapp.content.read` (texto sanitizado, metadado de mídia, transcrição de áudio).
`last_message_at` só 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](/pt-br/reference/whatsapp/listwhatsappconversations/).
**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 pelo `code`.
- `POST /oauth/token` mantém o formato de erro do OAuth 2.0 exigido pela
RFC 6749 §5.2.
**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_before` e `snapshot_at` foram removidos. Sem carimbo
dedicado de visibilidade não há sync incremental honesto; reconsulte por
período. O `updated_at` continua nas respostas, como informativo.
- Os filtros de data são `meeting_after` e `meeting_before`. Versões anteriores também
aceitavam `meeting_at_from` e `meeting_at_to`; eles nunca chegaram a parceiro e foram
removidos, em vez de nascerem descontinuados.
**Acesso**
- A API é gateada pela feature `API_ACCESS` da 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.
---
# Para LLMs e agentes
Source: https://docs.salesbud.com.br/pt-br/resources/for-agents
Esta documentação é publicada também em formato legível por máquina, para que um
agente a consuma sem raspar markup.
## Pontos de entrada
| Arquivo | Conteúdo |
| --- | --- |
| [`/llms.txt`](/llms.txt) | Índice: uma linha por página, com URL e resumo. Comece por aqui. |
| [`/llms-full.txt`](/llms-full.txt) | Todas as páginas concatenadas em Markdown puro, na ordem de leitura. |
| [`/openapi.yaml`](/openapi.yaml) | O contrato normativo. Tudo na referência da API é gerado dele. |
O formato segue a [convenção llms.txt](https://llmstxt.org/).
## Qualquer página em Markdown
Acrescente `.md` a qualquer URL da documentação para obter a fonte em vez da
página renderizada:
```
https://docs.salesbud.com.br/pt-br/guides/pagination/ → HTML
https://docs.salesbud.com.br/pt-br/guides/pagination.md → Markdown
```
As duas versões de idioma estão disponíveis; as páginas em português ficam sob
`/pt-br/`.
## Se você só precisa ler dado a partir de um agente
Esta API serve um servidor MCP em `https://api.salesbud.com.br/mcp`, que o claude.ai
alcança como conector personalizado. Ele expõe todas as operações públicas de
leitura como tools e cuida de renovação de token, retries e janelamento de
transcrição. É o caminho mais curto entre uma credencial e um agente lendo
reuniões — veja [Servidor MCP](/pt-br/guides/mcp/).
Escreva um cliente HTTP quando estiver construindo um serviço, e não pilotando
um modelo.
## Se você vai gerar código de integração
Três coisas erram com facilidade e vale ler antes de escrever qualquer linha:
1. **Itere por `pagination.has_more`, nunca por `data.length`.** Uma página pode
vir curta ou vazia com dado restante. Veja [Paginação](/pt-br/guides/pagination/).
2. **Ramifique por `error.code`, nunca por `error.detail`.** O detalhe é texto
humano e pode ser reescrito. Veja [Erros](/pt-br/guides/errors/).
3. **Não deduza o tipo de recurso pelo `type`.** O `object` diz se é `meeting` ou
`call`; o `type` diz só `video` ou `audio`, e os dois são independentes. Veja
[Reuniões e ligações](/pt-br/guides/meetings-and-calls/).
Não existe refresh token — renovar é chamar `/oauth/token` de novo. Isso é
propriedade do fluxo client credentials, não omissão.