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

uazapiOrkesioO que muda
GET /statusGET /statusSem mudança: a mesma rota e o mesmo formato da uazapi (é a mesma rota nas duas).
POST /instance/createPOST /inbox/createResponde 201 com a própria inbox (antes response, instance, status, name, token e info soltos).
POST /instance/token/rotatePOST /inbox/token/rotatePOST /inbox/token/rotate, só com o admintoken, como na uazapi; o id do corpo virou inbox_id (o nome antigo dá 400).
GET /instance/allGET /inbox/allLista em { inboxes: [...] } (antes um array solto).
POST /instance/updateAdminFieldsPATCH /inbox/admin-fieldsPATCH /inbox/admin-fields, só com o admintoken, como na uazapi; o id do corpo virou inbox_id (o nome antigo dá 400).
POST /admin/restartPOST /admin/restartSem mudança: a mesma rota e o mesmo formato da uazapi.
POST /admin/token/rotatePOST /admin/token/rotateSem mudança: a mesma rota e o mesmo formato da uazapi.

Inbox e conexão

uazapiOrkesioO que muda
POST /instance/connectPOST /inbox/connectA 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/disconnectPOST /inbox/disconnectA resposta é a inbox no formato novo (antes instance, response e info).
POST /instance/resetPOST /inbox/reset/inbox/reset.
GET /instance/statusGET /inbox/status, GET /leads/fieldsGET /inbox/status, como na uazapi (plural).
POST /instance/updateInstanceNamePATCH /inboxUm PATCH para os dois (antes duas rotas).
DELETE /instanceDELETE /inbox/inbox (a inbox do token).
POST /instance/presencePATCH /inboxUm PATCH para os dois (antes duas rotas).

Webhooks e eventos

uazapiOrkesioO que muda
GET /webhookGET /webhooksNovos name, headers (valor como ***) e secret; health em snake_case (antes avgMs, failCount...).
POST /webhookPOST /webhooks, PATCH /webhooks, DELETE /webhooks/{webhook_id}Rota própria para criar (antes action: add no POST /webhook).
GET /webhook/errorsGET /webhooks/{webhook_id}/failuresPor 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/resendPOST /webhooks/resendsPor webhook, na rota dele (antes id opcional no corpo; sem ele, reenviava de todos os webhooks). Responde 202 (antes 200).
GET /globalwebhookGET /server/webhookCampos em snake_case, com name, headers (valor como ***), secret (mascarado) e health.
POST /globalwebhookPATCH /server/webhook, DELETE /server/webhookPATCH parcial (antes o POST mandava a configuração inteira).
GET /globalwebhook/errorsGET /server/webhook/failuresLista paginada por cursor (limit, cursor), em snake_case, com a inbox de cada falha em inbox_id.
POST /globalwebhook/resendPOST /server/webhook/resendsO mesmo reenvio, agora com resposta 202 (antes 200).
GET /sseGET /eventsEndpoint próprio (/events); o /sse continua igual.

Mensagens e conversas

uazapiOrkesioO que muda
POST /send/textPOST /messagesUma 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/mediaPOST /messagesUma 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/contactPOST /messagesUma 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/locationPOST /messagesUma 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/presencePOST /chats/presencenumber → chat_id; presence → state (composing → typing) (o antigo pause: true vira state: paused); delay → duration_ms. Responde 202 sem corpo.
POST /send/menuPOST /messagesUma 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/carouselPOST /messagesUma 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-buttonPOST /messagesUma 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-paymentPOST /messagesUma 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/statusPATCH /messages/paymentid → message_id (a mensagem da cobrança).
POST /send/pix-buttonPOST /messagesUma 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/asyncGET /messages/queue/messages/queue (a fila é de mensagens).
DELETE /message/asyncDELETE /messages/queue/messages/queue (a fila é de mensagens).
POST /instance/updateDelaySettingsPATCH /messages/queue/settingsPATCH /messages/queue/settings (a espera é da fila).
POST /message/downloadPOST /messages/mediaid → message_id.
POST /message/findGET /messages, GET /status-postsGET com filtros na URL (antes POST com corpo).
POST /message/statusGET /messages/{message_id}/receiptsGET com a mensagem no caminho (antes id no corpo); state → status (minúsculo); página por cursor.
POST /message/history-syncPOST /chats/history-syncnumber → 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/reloadPOST /messages/reloadid ou messageid → message_id; responde 202 sem corpo (antes success e os detalhes da tentativa).
POST /message/markreadPOST /messages/readid (lista) → message_ids; results[].status → ok e error.
POST /message/reactPOST /messages/reactionsA mensagem em message_id (antes id); text → emoji ("" tira a reação, como na uazapi); number saiu (a conversa vem da mensagem).
POST /message/deleteDELETE /messages/{message_id}DELETE com a mensagem no caminho (antes id no corpo); responde 204 sem corpo.
POST /message/editPATCH /messagesid → message_id; responde a mensagem no formato novo.
POST /message/pinPOST /messages/pinA 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/labelsPATCH /chatschatbot_disableUntil (ms, -1, 0) → automation_paused_until (data ISO, forever ou null); chatbot_agentResetMemoryAt → ai_memory_from (data ISO, now ou null).
POST /chat/deleteDELETE /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/archivePATCH /chatschatbot_disableUntil (ms, -1, 0) → automation_paused_until (data ISO, forever ou null); chatbot_agentResetMemoryAt → ai_memory_from (data ISO, now ou null).
POST /chat/ephemeralPATCH /chatschatbot_disableUntil (ms, -1, 0) → automation_paused_until (data ISO, forever ou null); chatbot_agentResetMemoryAt → ai_memory_from (data ISO, now ou null).
POST /chat/readPATCH /chatschatbot_disableUntil (ms, -1, 0) → automation_paused_until (data ISO, forever ou null); chatbot_agentResetMemoryAt → ai_memory_from (data ISO, now ou null).
POST /chat/mutePATCH /chatschatbot_disableUntil (ms, -1, 0) → automation_paused_until (data ISO, forever ou null); chatbot_agentResetMemoryAt → ai_memory_from (data ISO, now ou null).
POST /chat/pinPATCH /chatschatbot_disableUntil (ms, -1, 0) → automation_paused_until (data ISO, forever ou null); chatbot_agentResetMemoryAt → ai_memory_from (data ISO, now ou null).
POST /chat/findGET /chats, GET /leadsGET com filtros na URL (antes POST com corpo e operadores como ~ e >=).
POST /chat/notesGET /chats/{chat_id}GET com a conversa no caminho (antes number no corpo).
POST /chat/notes/refreshPOST /chats/notes/refreshA conversa em chat_id; responde só {notes}.
POST /chat/notes/editPATCH /chatschatbot_disableUntil (ms, -1, 0) → automation_paused_until (data ISO, forever ou null); chatbot_agentResetMemoryAt → ai_memory_from (data ISO, now ou null).
GET /chat/totalcountGET /chats/countGET /chats/count, mesmo formato.
POST /chat/editLeadPATCH /chats, PATCH /leadschatbot_disableUntil (ms, -1, 0) → automation_paused_until (data ISO, forever ou null); chatbot_agentResetMemoryAt → ai_memory_from (data ISO, now ou null).
POST /lead/resolvePOST /chats/resolvePOST /chats/resolve; number → chat_id; lastMessageTimestamp (ms) → last_message_at (ISO).
POST /chat/detailsGET /chats/{chat_id}, GET /leads/{lead_id}GET com a conversa no caminho (antes number no corpo).
POST /chat/checkPOST /numbers/checkPOST /numbers/check; resposta em results.
POST /chat/avatarGET /chats/{chat_id}/pictureGET /chats/{chat_id}/picture; preview → size (preview ou full) na query.
POST /send/eventPOST /messagesUma 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

uazapiOrkesioO que muda
GET /instance/wa_messages_limitsGET /inbox/limits/inbox/limits, com a resposta reescrita: can_start_chats, restriction (só com restrição ativa) e quota.
GET /instance/proxyGET /inbox/proxy/inbox/proxy; last_test_at e fallback.since em ISO 8601.
POST /instance/proxyPATCH /inbox/proxyPATCH /inbox/proxy, mesmo corpo.
GET /proxy-managed/countriesGET /proxy-regions/countriesSem mudança no formato: o da uazapi; só o caminho (/proxy-regions/countries).
GET /proxy-managed/citiesGET /proxy-regions/citiesSem mudança no formato: o da uazapi; só o caminho (/proxy-regions/cities).
POST /profile/namePATCH /inbox/profileUm PATCH no lugar de duas rotas; um campo por pedido.
POST /profile/imagePATCH /inbox/profileUm PATCH no lugar de duas rotas; um campo por pedido.
GET /instance/privacyGET /inbox/privacy/inbox/privacy; nomes legíveis: groupadd → group_add, last → last_seen, profile → profile_picture, readreceipts → read_receipts, calladd → call_add.
POST /instance/privacyPATCH /inbox/privacyPATCH /inbox/privacy; os mesmos nomes do GET.
POST /send/statusPOST /status-postsRota própria (antes /send/status).
GET /instance/history-sync/statusGET /inbox/history-sync/inbox/history-sync; campos em snake_case (deliveryStatus → delivery_status, pairedAt → paired_at...).
POST /group/createPOST /groupsUma rota para grupo e comunidade (community: true).
POST /group/infoGET /groups/{group_id}GET com o grupo no caminho (antes groupjid no corpo).
POST /group/inviteInfoGET /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}GET com o grupo no caminho (antes groupjid no corpo).
POST /group/joinPOST /group-invites/acceptO código em code; responde o grupo, ou 202 quando a entrada precisa de aprovação.
POST /group/leavePOST /groups/leavegroupjid → group_id; responde 204 sem corpo (antes {response}).
GET /group/listGET /groupsUma rota GET com cursor (antes duas listas: a legada, inteira, e a paginada por offset).
POST /group/listGET /groupsUma rota GET com cursor (antes duas listas: a legada, inteira, e a paginada por offset).
POST /group/resetInviteCodePOST /groups/invite-link/resetResponde só {invite_link} (antes InviteLink e o grupo inteiro).
POST /group/updateAnnouncePATCH /groupsUm PATCH com o grupo em group_id, no lugar de oito rotas; continua uma mudança por pedido.
POST /group/updateJoinApprovalPATCH /groupsUm PATCH com o grupo em group_id, no lugar de oito rotas; continua uma mudança por pedido.
POST /group/updateMemberAddModePATCH /groupsUm PATCH com o grupo em group_id, no lugar de oito rotas; continua uma mudança por pedido.
POST /group/updateDescriptionPATCH /groupsUm PATCH com o grupo em group_id, no lugar de oito rotas; continua uma mudança por pedido.
POST /group/ephemeralPATCH /groupsUm PATCH com o grupo em group_id, no lugar de oito rotas; continua uma mudança por pedido.
POST /group/updateImagePATCH /groupsUm PATCH com o grupo em group_id, no lugar de oito rotas; continua uma mudança por pedido.
POST /group/updateLockedPATCH /groupsUm PATCH com o grupo em group_id, no lugar de oito rotas; continua uma mudança por pedido.
POST /group/updateNamePATCH /groupsUm PATCH com o grupo em group_id, no lugar de oito rotas; continua uma mudança por pedido.
POST /group/updateParticipantsPOST /groups/participantsO grupo em group_id; groupUpdated[]{JID, Error, AddRequest} → results[]{participant, ok, error, add_request}.
POST /community/createPOST /groupsUma rota para grupo e comunidade (community: true).
POST /community/editgroupsPOST /groups/subgroupsA comunidade em group_id; groupjids → group_ids; resposta {done, failed} (antes success, failed, message).
POST /newsletter/createPOST /newsletterspicture (URL ou base64) → objeto picture (url ou base64).
GET /newsletter/listGET /newslettersNewsletter 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/infoGET /newsletters/{newsletter_id}jid no corpo → newsletter_id no caminho.
POST /newsletter/linkGET /newsletter-invites/{key}key no caminho (antes no corpo).
POST /newsletter/subscribePOST /newsletters/{newsletter_id}/live-updatesjid → newsletter_id no caminho.
POST /newsletter/messagesGET /newsletters/{newsletter_id}/messagesjid no corpo → newsletter_id no caminho.
POST /newsletter/messages/editPATCH /newsletters/messagesjid → newsletter_id.
POST /newsletter/messages/deleteDELETE /newsletters/{newsletter_id}/messages/{message_id}jid no corpo → newsletter_id no caminho.
POST /newsletter/updatesGET /newsletters/{newsletter_id}/updatesjid no corpo → newsletter_id no caminho.
POST /newsletter/viewedPOST /newsletters/messages/viewedjid → newsletter_id.
POST /newsletter/reactionPOST /newsletters/messages/reactionsjid → newsletter_id.
POST /newsletter/followPOST /newsletters/followjid → newsletter_id.
POST /newsletter/unfollowDELETE /newsletters/{newsletter_id}/followjid no corpo → newsletter_id no caminho.
POST /newsletter/mutePATCH /newslettersUm PATCH com a newsletter em newsletter_id, no lugar de seis rotas; continua uma mudança por pedido.
POST /newsletter/unmutePATCH /newslettersUm PATCH com a newsletter em newsletter_id, no lugar de seis rotas; continua uma mudança por pedido.
POST /newsletter/deleteDELETE /newsletters/{newsletter_id}jid no corpo → newsletter_id no caminho.
POST /newsletter/picturePATCH /newslettersUm PATCH com a newsletter em newsletter_id, no lugar de seis rotas; continua uma mudança por pedido.
POST /newsletter/namePATCH /newslettersUm PATCH com a newsletter em newsletter_id, no lugar de seis rotas; continua uma mudança por pedido.
POST /newsletter/descriptionPATCH /newslettersUm PATCH com a newsletter em newsletter_id, no lugar de seis rotas; continua uma mudança por pedido.
POST /newsletter/settingsPATCH /newslettersUm PATCH com a newsletter em newsletter_id, no lugar de seis rotas; continua uma mudança por pedido.
POST /newsletter/searchGET /newsletter-directoryGET com filtros na URL: searchText → search, after → cursor; {response: {data, after}} → {newsletters, next_cursor}.
POST /newsletter/admin/invitePOST /newsletters/adminsjid → newsletter_id.
POST /newsletter/admin/acceptPOST /newsletters/admins/acceptjid → newsletter_id.
POST /newsletter/admin/removeDELETE /newsletters/{newsletter_id}/admins/{user_id}jid no corpo → newsletter_id no caminho.
POST /newsletter/admin/revokeDELETE /newsletters/{newsletter_id}/admin-invites/{user_id}jid no corpo → newsletter_id no caminho.
POST /newsletter/owner/transferPOST /newsletters/ownerjid → newsletter_id.
POST /chat/blockPUT /blocks, DELETE /blocks/{contact_id}PUT /blocks bloqueia (antes block: true).
GET /chat/blocklistGET /blocksGET /blocks; blockList → blocks.
GET /contactsGET /contacts/listGET /contacts/list com cursor, como as outras listas (antes POST com limit e offset no corpo e pagination).
POST /contacts/listGET /contacts/listGET /contacts/list com cursor, como as outras listas (antes POST com limit e offset no corpo e pagination).
POST /contact/addPUT /contactsPUT /contacts com name; number/phone → contact_id.
POST /contact/removeDELETE /contacts/{contact_id}DELETE /contacts/{contact_id}.
POST /label/editPOST /labels, PUT /labels, DELETE /labels/{label_id}POST /labels cria (antes labelid: "new").
GET /labelsGET /labels/listRota própria: o GET /labels da uazapi segue igual (lista solta, id <número>:<labelid>, colorHex).
POST /labels/refreshPOST /labels/syncPOST /labels/sync (antes /labels/refresh, que segue igual na uazapi).
POST /call/makePOST /callsnumber → to; call_duration → max_seconds; fileUrl → url ou base64.
POST /call/rejectPOST /calls/rejectid → call_id; number → chat_id; responde 204 sem corpo (antes response).
POST /business/get/profileGET /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/categoriesGET /business-categoriesSem o envelope response: {categories}; localized_display_name → name.
POST /business/update/profilePATCH /business-profiles/meResponde o perfil (antes response, updated e failed).
POST /business/catalog/listGET /catalog/productsGET 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/infoGET /catalog/products/{product_id}id no caminho e jid → chat_id; sem o envelope response.
POST /business/catalog/deleteDELETE /catalog/products/{product_id}id no caminho; responde 204.
POST /business/catalog/showPATCH /catalog/productsEditar é PATCH (antes o save com id); show/hide → is_hidden: false/true; responde o produto.
POST /business/catalog/hidePATCH /catalog/productsEditar é PATCH (antes o save com id); show/hide → is_hidden: false/true; responde o produto.
POST /business/catalog/savePOST /catalog/products, PATCH /catalog/productsCriar é 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/listGET /catalog/collectionsafter → cursor; {response: {collections, next}} → {collections, next_cursor}; a coleção é a mesma da uazapi, sem next e previous.
POST /business/catalog/collection/createPOST /catalog/collectionsMesmo corpo; responde sem o envelope response.
PATCH /business/catalog/collection/{id}PATCH /catalog/collections{id} → {collection_id}; mesmo corpo; responde sem o envelope response.
DELETE /business/catalog/collection/{id}DELETE /catalog/collections/{collection_id}{id} → {collection_id}; responde 204.

CRM e automações

uazapiOrkesioO que muda
POST /instance/updateFieldsMapPATCH /leads/fieldsRota própria; lead_field01 → field01; responde os campos (antes a inbox inteira).
POST /sender/simplePOST /campaignsUma rota para simples e avançada; cada mensagem no formato do corpo do POST /messages (sem to).
POST /sender/advancedPOST /campaignsUma rota para simples e avançada; cada mensagem no formato do corpo do POST /messages (sem to).
POST /sender/editPATCH /campaigns, 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/cleardoneDELETE /campaignsUma 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/clearallDELETE /campaignsUma 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/listfoldersGET /campaigns, GET /campaigns/{campaign_id}Lista solta → {campaigns, next_cursor}; o filtro status (reservado) saiu e entra o estado da campanha.
POST /sender/listmessagesGET /campaigns/{campaign_id}/messagesGET 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/statsGET /campaigns/statsSem 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/tagsGET /leads/tagsGET /leads/tags; lista em tags.
POST /lead/tags/editPOST /leads/tags, PATCH /leads/tags, DELETE /leads/tags/{tag_id}POST /leads/tags cria (antes sem id).
GET /chatwoot/configGET /integrations/chatwoot/integrations/chatwoot; campos sem o prefixo chatwoot_.
PUT /chatwoot/configPUT /integrations/chatwootPUT /integrations/chatwoot, mesmo corpo.
GET /quick-repliesGET /repliesCampos em snake_case; {items, pagination} → {replies, next_cursor}; offset → cursor.
POST /quick-repliesPOST /repliesshortCut → shortcut, aiDescription → ai_description, onWhatsApp → on_whatsapp.
GET /quick-replies/{id}GET /replies/{reply_id}{id} → {reply_id}; campos em snake_case.
PATCH /quick-replies/{id}PATCH /replies{id} → {reply_id}; campos em snake_case.
DELETE /quick-replies/{id}DELETE /replies/{reply_id}{id} → {reply_id}.