# Mapa das rotas: uazapi → Orkesio

Cada rota pública da uazapi e a rota da Orkesio que a substitui, agrupadas pela área da Orkesio. 164 de 164 rotas da uazapi têm par em 141 rotas da Orkesio: várias ações de um mesmo recurso (como as oito `/group/update*`) viram uma rota só, sem perder função. As rotas da uazapi continuam funcionando.

A coluna **O que muda** traz a primeira mudança; a lista completa e o exemplo estão na página da rota, em "Antes e depois".

## Administração

| uazapi | Orkesio | O que muda |
|---|---|---|
| `GET /status` | [GET /status](/endpoint/get/status) | Sem mudança: a mesma rota e o mesmo formato da uazapi (é a mesma rota nas duas). |
| `POST /instance/create` | [POST /inbox/create](/endpoint/post/inbox~create) | Responde `201` com a própria inbox (antes `response`, `instance`, `status`, `name`, `token` e `info` soltos). |
| `POST /instance/token/rotate` | [POST /inbox/token/rotate](/endpoint/post/inbox~token~rotate) | `POST /inbox/token/rotate`, só com o `admintoken`, como na uazapi; o `id` do corpo virou `inbox_id` (o nome antigo dá `400`). |
| `GET /instance/all` | [GET /inbox/all](/endpoint/get/inbox~all) | Lista em `{ inboxes: [...] }` (antes um array solto). |
| `POST /instance/updateAdminFields` | [PATCH /inbox/admin-fields](/endpoint/patch/inbox~admin-fields) | `PATCH /inbox/admin-fields`, só com o `admintoken`, como na uazapi; o `id` do corpo virou `inbox_id` (o nome antigo dá `400`). |
| `POST /admin/restart` | [POST /admin/restart](/endpoint/post/admin~restart) | Sem mudança: a mesma rota e o mesmo formato da uazapi. |
| `POST /admin/token/rotate` | [POST /admin/token/rotate](/endpoint/post/admin~token~rotate) | Sem mudança: a mesma rota e o mesmo formato da uazapi. |

## Inbox e conexão

| uazapi | Orkesio | O que muda |
|---|---|---|
| `POST /instance/connect` | [POST /inbox/connect](/endpoint/post/inbox~connect) | A resposta é a inbox, com `qr_code` ou `pair_code` e o `history_request_id` (antes `connected`, `loggedIn`, `jid`, `instance` e `request_id` soltos). |
| `POST /instance/disconnect` | [POST /inbox/disconnect](/endpoint/post/inbox~disconnect) | A resposta é a inbox no formato novo (antes `instance`, `response` e `info`). |
| `POST /instance/reset` | [POST /inbox/reset](/endpoint/post/inbox~reset) | `/inbox/reset`. |
| `GET /instance/status` | [GET /inbox/status](/endpoint/get/inbox~status), [GET /leads/fields](/endpoint/get/leads~fields) | `GET /inbox/status`, como na uazapi (plural). |
| `POST /instance/updateInstanceName` | [PATCH /inbox](/endpoint/patch/inbox) | Um `PATCH` para os dois (antes duas rotas). |
| `DELETE /instance` | [DELETE /inbox](/endpoint/delete/inbox) | `/inbox` (a inbox do token). |
| `POST /instance/presence` | [PATCH /inbox](/endpoint/patch/inbox) | Um `PATCH` para os dois (antes duas rotas). |

## Webhooks e eventos

| uazapi | Orkesio | O que muda |
|---|---|---|
| `GET /webhook` | [GET /webhooks](/endpoint/get/webhooks) | Novos `name`, `headers` (valor como `***`) e `secret`; `health` em `snake_case` (antes `avgMs`, `failCount`...). |
| `POST /webhook` | [POST /webhooks](/endpoint/post/webhooks), [PATCH /webhooks](/endpoint/patch/webhooks), [DELETE /webhooks/{webhook_id}](/endpoint/delete/webhooks~:webhook_id) | Rota própria para criar (antes `action: add` no `POST /webhook`). |
| `GET /webhook/errors` | [GET /webhooks/{webhook_id}/failures](/endpoint/get/webhooks~:webhook_id~failures) | Por webhook, na rota dele, com cursor (antes, uma lista só com as falhas de todos os webhooks da inbox). `created` → `failed_at`, `messageid` → `message_id`, `event` → `event_type` (nome da Orkesio). |
| `POST /webhook/resend` | [POST /webhooks/resends](/endpoint/post/webhooks~resends) | Por webhook, na rota dele (antes `id` opcional no corpo; sem ele, reenviava de todos os webhooks). Responde `202` (antes `200`). |
| `GET /globalwebhook` | [GET /server/webhook](/endpoint/get/server~webhook) | Campos em `snake_case`, com `name`, `headers` (valor como `***`), `secret` (mascarado) e `health`. |
| `POST /globalwebhook` | [PATCH /server/webhook](/endpoint/patch/server~webhook), [DELETE /server/webhook](/endpoint/delete/server~webhook) | `PATCH` parcial (antes o `POST` mandava a configuração inteira). |
| `GET /globalwebhook/errors` | [GET /server/webhook/failures](/endpoint/get/server~webhook~failures) | Lista paginada por cursor (`limit`, `cursor`), em `snake_case`, com a inbox de cada falha em `inbox_id`. |
| `POST /globalwebhook/resend` | [POST /server/webhook/resends](/endpoint/post/server~webhook~resends) | O mesmo reenvio, agora com resposta `202` (antes `200`). |
| `GET /sse` | [GET /events](/endpoint/get/events) | Endpoint próprio (`/events`); o `/sse` continua igual. |

## Mensagens e conversas

| uazapi | Orkesio | O que muda |
|---|---|---|
| `POST /send/text` | [POST /messages](/endpoint/post/messages) | Uma rota para todos os tipos: `type` diz o tipo, e os campos dele vão soltos no corpo, como na uazapi (`text`, `latitude`, `choices`), igual à mensagem recebida. |
| `POST /send/media` | [POST /messages](/endpoint/post/messages) | Uma rota para todos os tipos: `type` diz o tipo, e os campos dele vão soltos no corpo, como na uazapi (`text`, `latitude`, `choices`), igual à mensagem recebida. |
| `POST /send/contact` | [POST /messages](/endpoint/post/messages) | Uma rota para todos os tipos: `type` diz o tipo, e os campos dele vão soltos no corpo, como na uazapi (`text`, `latitude`, `choices`), igual à mensagem recebida. |
| `POST /send/location` | [POST /messages](/endpoint/post/messages) | Uma rota para todos os tipos: `type` diz o tipo, e os campos dele vão soltos no corpo, como na uazapi (`text`, `latitude`, `choices`), igual à mensagem recebida. |
| `POST /message/presence` | [POST /chats/presence](/endpoint/post/chats~presence) | `number` → `chat_id`; `presence` → `state` (`composing` → `typing`) (o antigo `pause: true` vira `state: paused`); `delay` → `duration_ms`. Responde `202` sem corpo. |
| `POST /send/menu` | [POST /messages](/endpoint/post/messages) | Uma rota para todos os tipos: `type` diz o tipo, e os campos dele vão soltos no corpo, como na uazapi (`text`, `latitude`, `choices`), igual à mensagem recebida. |
| `POST /send/carousel` | [POST /messages](/endpoint/post/messages) | Uma rota para todos os tipos: `type` diz o tipo, e os campos dele vão soltos no corpo, como na uazapi (`text`, `latitude`, `choices`), igual à mensagem recebida. |
| `POST /send/location-button` | [POST /messages](/endpoint/post/messages) | Uma rota para todos os tipos: `type` diz o tipo, e os campos dele vão soltos no corpo, como na uazapi (`text`, `latitude`, `choices`), igual à mensagem recebida. |
| `POST /send/request-payment` | [POST /messages](/endpoint/post/messages) | Uma rota para todos os tipos: `type` diz o tipo, e os campos dele vão soltos no corpo, como na uazapi (`text`, `latitude`, `choices`), igual à mensagem recebida. |
| `POST /message/payment/status` | [PATCH /messages/payment](/endpoint/patch/messages~payment) | `id` → `message_id` (a mensagem da cobrança). |
| `POST /send/pix-button` | [POST /messages](/endpoint/post/messages) | Uma rota para todos os tipos: `type` diz o tipo, e os campos dele vão soltos no corpo, como na uazapi (`text`, `latitude`, `choices`), igual à mensagem recebida. |
| `GET /message/async` | [GET /messages/queue](/endpoint/get/messages~queue) | `/messages/queue` (a fila é de mensagens). |
| `DELETE /message/async` | [DELETE /messages/queue](/endpoint/delete/messages~queue) | `/messages/queue` (a fila é de mensagens). |
| `POST /instance/updateDelaySettings` | [PATCH /messages/queue/settings](/endpoint/patch/messages~queue~settings) | `PATCH /messages/queue/settings` (a espera é da fila). |
| `POST /message/download` | [POST /messages/media](/endpoint/post/messages~media) | `id` → `message_id`. |
| `POST /message/find` | [GET /messages](/endpoint/get/messages), [GET /status-posts](/endpoint/get/status-posts) | `GET` com filtros na URL (antes `POST` com corpo). |
| `POST /message/status` | [GET /messages/{message_id}/receipts](/endpoint/get/messages~:message_id~receipts) | `GET` com a mensagem no caminho (antes `id` no corpo); `state` → `status` (minúsculo); página por `cursor`. |
| `POST /message/history-sync` | [POST /chats/history-sync](/endpoint/post/chats~history-sync) | `number` → `chat_id`; `messageid` → `before_id`; `timestamp` → `before_at` (data ISO); `fromMe` → `before_direction` (`in`/`out`); `requestId` → `request_id`; `fallbackMode` → `mode`; `sync` → `wait`; `timeoutMs` → `timeout_ms`. |
| `POST /message/reload` | [POST /messages/reload](/endpoint/post/messages~reload) | `id` ou `messageid` → `message_id`; responde `202` sem corpo (antes `success` e os detalhes da tentativa). |
| `POST /message/markread` | [POST /messages/read](/endpoint/post/messages~read) | `id` (lista) → `message_ids`; `results[].status` → `ok` e `error`. |
| `POST /message/react` | [POST /messages/reactions](/endpoint/post/messages~reactions) | A mensagem em `message_id` (antes `id`); `text` → `emoji` (`""` tira a reação, como na uazapi); `number` saiu (a conversa vem da mensagem). |
| `POST /message/delete` | [DELETE /messages/{message_id}](/endpoint/delete/messages~:message_id) | `DELETE` com a mensagem no caminho (antes `id` no corpo); responde `204` sem corpo. |
| `POST /message/edit` | [PATCH /messages](/endpoint/patch/messages) | `id` → `message_id`; responde a mensagem no formato novo. |
| `POST /message/pin` | [POST /messages/pin](/endpoint/post/messages~pin) | A mensagem em `message_id` (antes `id`); `duration` em dias (`1`, `7`, `30`) → `duration_days`; `pin: false` desafixa, como na uazapi. Responde a mensagem com `pinned` e `pinned_until`. |
| `POST /chat/labels` | [PATCH /chats](/endpoint/patch/chats) | `chatbot_disableUntil` (ms, `-1`, `0`) → `automation_paused_until` (data ISO, `forever` ou `null`); `chatbot_agentResetMemoryAt` → `ai_memory_from` (data ISO, `now` ou `null`). |
| `POST /chat/delete` | [DELETE /chats/{chat_id}](/endpoint/delete/chats~:chat_id) | `DELETE /chats/{chat_id}`; os quatro campos `true` viram `whatsapp` (`delete`, `clear`, `keep`) e `local` (`delete`, `chat`, `messages`, `keep`), na query. |
| `POST /chat/archive` | [PATCH /chats](/endpoint/patch/chats) | `chatbot_disableUntil` (ms, `-1`, `0`) → `automation_paused_until` (data ISO, `forever` ou `null`); `chatbot_agentResetMemoryAt` → `ai_memory_from` (data ISO, `now` ou `null`). |
| `POST /chat/ephemeral` | [PATCH /chats](/endpoint/patch/chats) | `chatbot_disableUntil` (ms, `-1`, `0`) → `automation_paused_until` (data ISO, `forever` ou `null`); `chatbot_agentResetMemoryAt` → `ai_memory_from` (data ISO, `now` ou `null`). |
| `POST /chat/read` | [PATCH /chats](/endpoint/patch/chats) | `chatbot_disableUntil` (ms, `-1`, `0`) → `automation_paused_until` (data ISO, `forever` ou `null`); `chatbot_agentResetMemoryAt` → `ai_memory_from` (data ISO, `now` ou `null`). |
| `POST /chat/mute` | [PATCH /chats](/endpoint/patch/chats) | `chatbot_disableUntil` (ms, `-1`, `0`) → `automation_paused_until` (data ISO, `forever` ou `null`); `chatbot_agentResetMemoryAt` → `ai_memory_from` (data ISO, `now` ou `null`). |
| `POST /chat/pin` | [PATCH /chats](/endpoint/patch/chats) | `chatbot_disableUntil` (ms, `-1`, `0`) → `automation_paused_until` (data ISO, `forever` ou `null`); `chatbot_agentResetMemoryAt` → `ai_memory_from` (data ISO, `now` ou `null`). |
| `POST /chat/find` | [GET /chats](/endpoint/get/chats), [GET /leads](/endpoint/get/leads) | `GET` com filtros na URL (antes `POST` com corpo e operadores como `~` e `>=`). |
| `POST /chat/notes` | [GET /chats/{chat_id}](/endpoint/get/chats~:chat_id) | `GET` com a conversa no caminho (antes `number` no corpo). |
| `POST /chat/notes/refresh` | [POST /chats/notes/refresh](/endpoint/post/chats~notes~refresh) | A conversa em `chat_id`; responde só `{notes}`. |
| `POST /chat/notes/edit` | [PATCH /chats](/endpoint/patch/chats) | `chatbot_disableUntil` (ms, `-1`, `0`) → `automation_paused_until` (data ISO, `forever` ou `null`); `chatbot_agentResetMemoryAt` → `ai_memory_from` (data ISO, `now` ou `null`). |
| `GET /chat/totalcount` | [GET /chats/count](/endpoint/get/chats~count) | `GET /chats/count`, mesmo formato. |
| `POST /chat/editLead` | [PATCH /chats](/endpoint/patch/chats), [PATCH /leads](/endpoint/patch/leads) | `chatbot_disableUntil` (ms, `-1`, `0`) → `automation_paused_until` (data ISO, `forever` ou `null`); `chatbot_agentResetMemoryAt` → `ai_memory_from` (data ISO, `now` ou `null`). |
| `POST /lead/resolve` | [POST /chats/resolve](/endpoint/post/chats~resolve) | `POST /chats/resolve`; `number` → `chat_id`; `lastMessageTimestamp` (ms) → `last_message_at` (ISO). |
| `POST /chat/details` | [GET /chats/{chat_id}](/endpoint/get/chats~:chat_id), [GET /leads/{lead_id}](/endpoint/get/leads~:lead_id) | `GET` com a conversa no caminho (antes `number` no corpo). |
| `POST /chat/check` | [POST /numbers/check](/endpoint/post/numbers~check) | `POST /numbers/check`; resposta em `results`. |
| `POST /chat/avatar` | [GET /chats/{chat_id}/picture](/endpoint/get/chats~:chat_id~picture) | `GET /chats/{chat_id}/picture`; `preview` → `size` (`preview` ou `full`) na query. |
| `POST /send/event` | [POST /messages](/endpoint/post/messages) | Uma rota para todos os tipos: `type` diz o tipo, e os campos dele vão soltos no corpo, como na uazapi (`text`, `latitude`, `choices`), igual à mensagem recebida. |

## WhatsApp

| uazapi | Orkesio | O que muda |
|---|---|---|
| `GET /instance/wa_messages_limits` | [GET /inbox/limits](/endpoint/get/inbox~limits) | `/inbox/limits`, com a resposta reescrita: `can_start_chats`, `restriction` (só com restrição ativa) e `quota`. |
| `GET /instance/proxy` | [GET /inbox/proxy](/endpoint/get/inbox~proxy) | `/inbox/proxy`; `last_test_at` e `fallback.since` em ISO 8601. |
| `POST /instance/proxy` | [PATCH /inbox/proxy](/endpoint/patch/inbox~proxy) | `PATCH /inbox/proxy`, mesmo corpo. |
| `GET /proxy-managed/countries` | [GET /proxy-regions/countries](/endpoint/get/proxy-regions~countries) | Sem mudança no formato: o da uazapi; só o caminho (`/proxy-regions/countries`). |
| `GET /proxy-managed/cities` | [GET /proxy-regions/cities](/endpoint/get/proxy-regions~cities) | Sem mudança no formato: o da uazapi; só o caminho (`/proxy-regions/cities`). |
| `POST /profile/name` | [PATCH /inbox/profile](/endpoint/patch/inbox~profile) | Um `PATCH` no lugar de duas rotas; um campo por pedido. |
| `POST /profile/image` | [PATCH /inbox/profile](/endpoint/patch/inbox~profile) | Um `PATCH` no lugar de duas rotas; um campo por pedido. |
| `GET /instance/privacy` | [GET /inbox/privacy](/endpoint/get/inbox~privacy) | `/inbox/privacy`; nomes legíveis: `groupadd` → `group_add`, `last` → `last_seen`, `profile` → `profile_picture`, `readreceipts` → `read_receipts`, `calladd` → `call_add`. |
| `POST /instance/privacy` | [PATCH /inbox/privacy](/endpoint/patch/inbox~privacy) | `PATCH /inbox/privacy`; os mesmos nomes do `GET`. |
| `POST /send/status` | [POST /status-posts](/endpoint/post/status-posts) | Rota própria (antes `/send/status`). |
| `GET /instance/history-sync/status` | [GET /inbox/history-sync](/endpoint/get/inbox~history-sync) | `/inbox/history-sync`; campos em snake_case (`deliveryStatus` → `delivery_status`, `pairedAt` → `paired_at`...). |
| `POST /group/create` | [POST /groups](/endpoint/post/groups) | Uma rota para grupo e comunidade (`community: true`). |
| `POST /group/info` | [GET /groups/{group_id}](/endpoint/get/groups~:group_id) | `GET` com o grupo no caminho (antes `groupjid` no corpo). |
| `POST /group/inviteInfo` | [GET /group-invites/{code}](/endpoint/get/group-invites~:code) | `GET` com o código no caminho; responde o grupo (antes `response` e `group`). |
| `GET /group/invitelink/{groupJID}` | [GET /groups/{group_id}](/endpoint/get/groups~:group_id) | `GET` com o grupo no caminho (antes `groupjid` no corpo). |
| `POST /group/join` | [POST /group-invites/accept](/endpoint/post/group-invites~accept) | O código em `code`; responde o grupo, ou `202` quando a entrada precisa de aprovação. |
| `POST /group/leave` | [POST /groups/leave](/endpoint/post/groups~leave) | `groupjid` → `group_id`; responde `204` sem corpo (antes `{response}`). |
| `GET /group/list` | [GET /groups](/endpoint/get/groups) | Uma rota `GET` com cursor (antes duas listas: a legada, inteira, e a paginada por `offset`). |
| `POST /group/list` | [GET /groups](/endpoint/get/groups) | Uma rota `GET` com cursor (antes duas listas: a legada, inteira, e a paginada por `offset`). |
| `POST /group/resetInviteCode` | [POST /groups/invite-link/reset](/endpoint/post/groups~invite-link~reset) | Responde só `{invite_link}` (antes `InviteLink` e o grupo inteiro). |
| `POST /group/updateAnnounce` | [PATCH /groups](/endpoint/patch/groups) | Um `PATCH` com o grupo em `group_id`, no lugar de oito rotas; continua uma mudança por pedido. |
| `POST /group/updateJoinApproval` | [PATCH /groups](/endpoint/patch/groups) | Um `PATCH` com o grupo em `group_id`, no lugar de oito rotas; continua uma mudança por pedido. |
| `POST /group/updateMemberAddMode` | [PATCH /groups](/endpoint/patch/groups) | Um `PATCH` com o grupo em `group_id`, no lugar de oito rotas; continua uma mudança por pedido. |
| `POST /group/updateDescription` | [PATCH /groups](/endpoint/patch/groups) | Um `PATCH` com o grupo em `group_id`, no lugar de oito rotas; continua uma mudança por pedido. |
| `POST /group/ephemeral` | [PATCH /groups](/endpoint/patch/groups) | Um `PATCH` com o grupo em `group_id`, no lugar de oito rotas; continua uma mudança por pedido. |
| `POST /group/updateImage` | [PATCH /groups](/endpoint/patch/groups) | Um `PATCH` com o grupo em `group_id`, no lugar de oito rotas; continua uma mudança por pedido. |
| `POST /group/updateLocked` | [PATCH /groups](/endpoint/patch/groups) | Um `PATCH` com o grupo em `group_id`, no lugar de oito rotas; continua uma mudança por pedido. |
| `POST /group/updateName` | [PATCH /groups](/endpoint/patch/groups) | Um `PATCH` com o grupo em `group_id`, no lugar de oito rotas; continua uma mudança por pedido. |
| `POST /group/updateParticipants` | [POST /groups/participants](/endpoint/post/groups~participants) | O grupo em `group_id`; `groupUpdated[]{JID, Error, AddRequest}` → `results[]{participant, ok, error, add_request}`. |
| `POST /community/create` | [POST /groups](/endpoint/post/groups) | Uma rota para grupo e comunidade (`community: true`). |
| `POST /community/editgroups` | [POST /groups/subgroups](/endpoint/post/groups~subgroups) | A comunidade em `group_id`; `groupjids` → `group_ids`; resposta `{done, failed}` (antes `success`, `failed`, `message`). |
| `POST /newsletter/create` | [POST /newsletters](/endpoint/post/newsletters) | `picture` (URL ou base64) → objeto `picture` (`url` ou `base64`). |
| `GET /newsletter/list` | [GET /newsletters](/endpoint/get/newsletters) | Newsletter no formato novo: `thread_metadata.name.text` → `name`, `.description.text` → `description`, `.picture`/`.preview` → `picture_url`/`picture_preview_url`, `.subscribers_count` → `subscriber_count`, `.verification` → `verified`, `.invite` → `invite_code`, `.settings.reaction_codes` → `reaction_mode`, `.creation_time` → `created_at`; `state.type` → `state`; `viewer_metadata.role` → `role`, `.mute` → `muted`. |
| `POST /newsletter/info` | [GET /newsletters/{newsletter_id}](/endpoint/get/newsletters~:newsletter_id) | `jid` no corpo → `newsletter_id` no caminho. |
| `POST /newsletter/link` | [GET /newsletter-invites/{key}](/endpoint/get/newsletter-invites~:key) | `key` no caminho (antes no corpo). |
| `POST /newsletter/subscribe` | [POST /newsletters/{newsletter_id}/live-updates](/endpoint/post/newsletters~:newsletter_id~live-updates) | `jid` → `newsletter_id` no caminho. |
| `POST /newsletter/messages` | [GET /newsletters/{newsletter_id}/messages](/endpoint/get/newsletters~:newsletter_id~messages) | `jid` no corpo → `newsletter_id` no caminho. |
| `POST /newsletter/messages/edit` | [PATCH /newsletters/messages](/endpoint/patch/newsletters~messages) | `jid` → `newsletter_id`. |
| `POST /newsletter/messages/delete` | [DELETE /newsletters/{newsletter_id}/messages/{message_id}](/endpoint/delete/newsletters~:newsletter_id~messages~:message_id) | `jid` no corpo → `newsletter_id` no caminho. |
| `POST /newsletter/updates` | [GET /newsletters/{newsletter_id}/updates](/endpoint/get/newsletters~:newsletter_id~updates) | `jid` no corpo → `newsletter_id` no caminho. |
| `POST /newsletter/viewed` | [POST /newsletters/messages/viewed](/endpoint/post/newsletters~messages~viewed) | `jid` → `newsletter_id`. |
| `POST /newsletter/reaction` | [POST /newsletters/messages/reactions](/endpoint/post/newsletters~messages~reactions) | `jid` → `newsletter_id`. |
| `POST /newsletter/follow` | [POST /newsletters/follow](/endpoint/post/newsletters~follow) | `jid` → `newsletter_id`. |
| `POST /newsletter/unfollow` | [DELETE /newsletters/{newsletter_id}/follow](/endpoint/delete/newsletters~:newsletter_id~follow) | `jid` no corpo → `newsletter_id` no caminho. |
| `POST /newsletter/mute` | [PATCH /newsletters](/endpoint/patch/newsletters) | Um `PATCH` com a newsletter em `newsletter_id`, no lugar de seis rotas; continua uma mudança por pedido. |
| `POST /newsletter/unmute` | [PATCH /newsletters](/endpoint/patch/newsletters) | Um `PATCH` com a newsletter em `newsletter_id`, no lugar de seis rotas; continua uma mudança por pedido. |
| `POST /newsletter/delete` | [DELETE /newsletters/{newsletter_id}](/endpoint/delete/newsletters~:newsletter_id) | `jid` no corpo → `newsletter_id` no caminho. |
| `POST /newsletter/picture` | [PATCH /newsletters](/endpoint/patch/newsletters) | Um `PATCH` com a newsletter em `newsletter_id`, no lugar de seis rotas; continua uma mudança por pedido. |
| `POST /newsletter/name` | [PATCH /newsletters](/endpoint/patch/newsletters) | Um `PATCH` com a newsletter em `newsletter_id`, no lugar de seis rotas; continua uma mudança por pedido. |
| `POST /newsletter/description` | [PATCH /newsletters](/endpoint/patch/newsletters) | Um `PATCH` com a newsletter em `newsletter_id`, no lugar de seis rotas; continua uma mudança por pedido. |
| `POST /newsletter/settings` | [PATCH /newsletters](/endpoint/patch/newsletters) | Um `PATCH` com a newsletter em `newsletter_id`, no lugar de seis rotas; continua uma mudança por pedido. |
| `POST /newsletter/search` | [GET /newsletter-directory](/endpoint/get/newsletter-directory) | `GET` com filtros na URL: `searchText` → `search`, `after` → `cursor`; `{response: {data, after}}` → `{newsletters, next_cursor}`. |
| `POST /newsletter/admin/invite` | [POST /newsletters/admins](/endpoint/post/newsletters~admins) | `jid` → `newsletter_id`. |
| `POST /newsletter/admin/accept` | [POST /newsletters/admins/accept](/endpoint/post/newsletters~admins~accept) | `jid` → `newsletter_id`. |
| `POST /newsletter/admin/remove` | [DELETE /newsletters/{newsletter_id}/admins/{user_id}](/endpoint/delete/newsletters~:newsletter_id~admins~:user_id) | `jid` no corpo → `newsletter_id` no caminho. |
| `POST /newsletter/admin/revoke` | [DELETE /newsletters/{newsletter_id}/admin-invites/{user_id}](/endpoint/delete/newsletters~:newsletter_id~admin-invites~:user_id) | `jid` no corpo → `newsletter_id` no caminho. |
| `POST /newsletter/owner/transfer` | [POST /newsletters/owner](/endpoint/post/newsletters~owner) | `jid` → `newsletter_id`. |
| `POST /chat/block` | [PUT /blocks](/endpoint/put/blocks), [DELETE /blocks/{contact_id}](/endpoint/delete/blocks~:contact_id) | `PUT /blocks` bloqueia (antes `block: true`). |
| `GET /chat/blocklist` | [GET /blocks](/endpoint/get/blocks) | `GET /blocks`; `blockList` → `blocks`. |
| `GET /contacts` | [GET /contacts/list](/endpoint/get/contacts~list) | `GET /contacts/list` com cursor, como as outras listas (antes `POST` com `limit` e `offset` no corpo e `pagination`). |
| `POST /contacts/list` | [GET /contacts/list](/endpoint/get/contacts~list) | `GET /contacts/list` com cursor, como as outras listas (antes `POST` com `limit` e `offset` no corpo e `pagination`). |
| `POST /contact/add` | [PUT /contacts](/endpoint/put/contacts) | `PUT /contacts` com `name`; `number`/`phone` → `contact_id`. |
| `POST /contact/remove` | [DELETE /contacts/{contact_id}](/endpoint/delete/contacts~:contact_id) | `DELETE /contacts/{contact_id}`. |
| `POST /label/edit` | [POST /labels](/endpoint/post/labels), [PUT /labels](/endpoint/put/labels), [DELETE /labels/{label_id}](/endpoint/delete/labels~:label_id) | `POST /labels` cria (antes `labelid: "new"`). |
| `GET /labels` | [GET /labels/list](/endpoint/get/labels~list) | Rota própria: o `GET /labels` da uazapi segue igual (lista solta, `id` `<número>:<labelid>`, `colorHex`). |
| `POST /labels/refresh` | [POST /labels/sync](/endpoint/post/labels~sync) | `POST /labels/sync` (antes `/labels/refresh`, que segue igual na uazapi). |
| `POST /call/make` | [POST /calls](/endpoint/post/calls) | `number` → `to`; `call_duration` → `max_seconds`; `fileUrl` → `url` ou `base64`. |
| `POST /call/reject` | [POST /calls/reject](/endpoint/post/calls~reject) | `id` → `call_id`; `number` → `chat_id`; responde `204` sem corpo (antes `response`). |
| `POST /business/get/profile` | [GET /business-profiles/{chat_id}](/endpoint/get/business-profiles~:chat_id) | `jid` no caminho (antes no corpo; vazio era a inbox, agora `me`); sem o envelope `response`; `categories[].localized_display_name` → `name`; `tag` saiu (interno). |
| `GET /business/get/categories` | [GET /business-categories](/endpoint/get/business-categories) | Sem o envelope `response`: `{categories}`; `localized_display_name` → `name`. |
| `POST /business/update/profile` | [PATCH /business-profiles/me](/endpoint/patch/business-profiles~me) | Responde o perfil (antes `response`, `updated` e `failed`). |
| `POST /business/catalog/list` | [GET /catalog/products](/endpoint/get/catalog~products) | `GET` com filtros na URL: `jid` → `chat_id`, `after` → `cursor`; `{response: {products, next, previous}}` → `{products, next_cursor}`. O produto é o mesmo da uazapi. |
| `POST /business/catalog/info` | [GET /catalog/products/{product_id}](/endpoint/get/catalog~products~:product_id) | `id` no caminho e `jid` → `chat_id`; sem o envelope `response`. |
| `POST /business/catalog/delete` | [DELETE /catalog/products/{product_id}](/endpoint/delete/catalog~products~:product_id) | `id` no caminho; responde `204`. |
| `POST /business/catalog/show` | [PATCH /catalog/products](/endpoint/patch/catalog~products) | Editar é `PATCH` (antes o `save` com `id`); `show`/`hide` → `is_hidden: false`/`true`; responde o produto. |
| `POST /business/catalog/hide` | [PATCH /catalog/products](/endpoint/patch/catalog~products) | Editar é `PATCH` (antes o `save` com `id`); `show`/`hide` → `is_hidden: false`/`true`; responde o produto. |
| `POST /business/catalog/save` | [POST /catalog/products](/endpoint/post/catalog~products), [PATCH /catalog/products](/endpoint/patch/catalog~products) | Criar é `POST` (antes o `save` sem `id`); os campos são os mesmos da uazapi; responde o produto sem o envelope `response`. |
| `GET /business/catalog/collection/list` | [GET /catalog/collections](/endpoint/get/catalog~collections) | `after` → `cursor`; `{response: {collections, next}}` → `{collections, next_cursor}`; a coleção é a mesma da uazapi, sem `next` e `previous`. |
| `POST /business/catalog/collection/create` | [POST /catalog/collections](/endpoint/post/catalog~collections) | Mesmo corpo; responde sem o envelope `response`. |
| `PATCH /business/catalog/collection/{id}` | [PATCH /catalog/collections](/endpoint/patch/catalog~collections) | `{id}` → `{collection_id}`; mesmo corpo; responde sem o envelope `response`. |
| `DELETE /business/catalog/collection/{id}` | [DELETE /catalog/collections/{collection_id}](/endpoint/delete/catalog~collections~:collection_id) | `{id}` → `{collection_id}`; responde `204`. |

## CRM e automações

| uazapi | Orkesio | O que muda |
|---|---|---|
| `POST /instance/updateFieldsMap` | [PATCH /leads/fields](/endpoint/patch/leads~fields) | Rota própria; `lead_field01` → `field01`; responde os campos (antes a inbox inteira). |
| `POST /sender/simple` | [POST /campaigns](/endpoint/post/campaigns) | Uma rota para simples e avançada; cada mensagem no formato do corpo do `POST /messages` (sem `to`). |
| `POST /sender/advanced` | [POST /campaigns](/endpoint/post/campaigns) | Uma rota para simples e avançada; cada mensagem no formato do corpo do `POST /messages` (sem `to`). |
| `POST /sender/edit` | [PATCH /campaigns](/endpoint/patch/campaigns), [DELETE /campaigns/{campaign_id}](/endpoint/delete/campaigns~:campaign_id) | `folder_id` → `campaign_id`; as ações viram campos: `stop` → `status: paused`, `continue` → `status: scheduled`, `send_now` → `status: sending`, `reschedule` → `scheduled_at` (data ISO); `delete` → `DELETE /campaigns/{campaign_id}`. |
| `POST /sender/cleardone` | [DELETE /campaigns](/endpoint/delete/campaigns) | Uma rota com filtro: `cleardone` → `status=done` com `older_than_hours` (antes `hours` no corpo, padrão 0: todas as terminadas; agora padrão 168); `clearall` → `all=true`. |
| `DELETE /sender/clearall` | [DELETE /campaigns](/endpoint/delete/campaigns) | Uma rota com filtro: `cleardone` → `status=done` com `older_than_hours` (antes `hours` no corpo, padrão 0: todas as terminadas; agora padrão 168); `clearall` → `all=true`. |
| `GET /sender/listfolders` | [GET /campaigns](/endpoint/get/campaigns), [GET /campaigns/{campaign_id}](/endpoint/get/campaigns~:campaign_id) | Lista solta → `{campaigns, next_cursor}`; o filtro `status` (reservado) saiu e entra o estado da campanha. |
| `POST /sender/listmessages` | [GET /campaigns/{campaign_id}/messages](/endpoint/get/campaigns~:campaign_id~messages) | `GET` com a campanha no caminho; `messageStatus` → `status` (minúsculo); `offset` → `cursor`; mensagens no formato novo; `pagination` → `next_cursor` (os totais estão na campanha). |
| `GET /sender/stats` | [GET /campaigns/stats](/endpoint/get/campaigns~stats) | Sem o envelope `data`; os grupos `status`, `statistics` e `scheduling` viram campos diretos; `next_send_in_seconds` saiu (use `next_send_at`); os dados da inbox (`data.instance`) saíram (estão em `GET /inbox/status`). |
| `GET /lead/tags` | [GET /leads/tags](/endpoint/get/leads~tags) | `GET /leads/tags`; lista em `tags`. |
| `POST /lead/tags/edit` | [POST /leads/tags](/endpoint/post/leads~tags), [PATCH /leads/tags](/endpoint/patch/leads~tags), [DELETE /leads/tags/{tag_id}](/endpoint/delete/leads~tags~:tag_id) | `POST /leads/tags` cria (antes sem `id`). |
| `GET /chatwoot/config` | [GET /integrations/chatwoot](/endpoint/get/integrations~chatwoot) | `/integrations/chatwoot`; campos sem o prefixo `chatwoot_`. |
| `PUT /chatwoot/config` | [PUT /integrations/chatwoot](/endpoint/put/integrations~chatwoot) | `PUT /integrations/chatwoot`, mesmo corpo. |
| `GET /quick-replies` | [GET /replies](/endpoint/get/replies) | Campos em snake_case; `{items, pagination}` → `{replies, next_cursor}`; `offset` → `cursor`. |
| `POST /quick-replies` | [POST /replies](/endpoint/post/replies) | `shortCut` → `shortcut`, `aiDescription` → `ai_description`, `onWhatsApp` → `on_whatsapp`. |
| `GET /quick-replies/{id}` | [GET /replies/{reply_id}](/endpoint/get/replies~:reply_id) | `{id}` → `{reply_id}`; campos em snake_case. |
| `PATCH /quick-replies/{id}` | [PATCH /replies](/endpoint/patch/replies) | `{id}` → `{reply_id}`; campos em snake_case. |
| `DELETE /quick-replies/{id}` | [DELETE /replies/{reply_id}](/endpoint/delete/replies~:reply_id) | `{id}` → `{reply_id}`. |

