Configurar o proxy

PATCH /inbox/proxy

Escolhe como a inbox sai para o WhatsApp:

modeO que faz
customUsa o seu proxy, em url.
internalUsa o proxy da Orkesio. country, state e city escolhe a região; rotate_now: true troca o IP agora.
noneConexão direta, sem proxy. Exige confirm_no_proxy: true.

O 200 confirma que a configuração foi salva, não que o proxy funciona: o teste real é na conexão. Se a inbox estiver conectada, a api reconecta na hora para aplicar (reconnecting: true). Depois, confira em GET /inbox/proxy (effective_mode, fallback_state.active, last_test_error).

Com custom, fallback diz o que fazer se o seu proxy falhar: internal (padrão: usa o proxy da Orkesio e, em último caso, conexão direta), never (não troca) ou a URL de outro proxy seu.

Autenticação

[
  {
    "token": []
  }
]
{
  "token": {
    "name": "token",
    "type": "apiKey",
    "in": "header"
  }
}

Corpo da requisição

{
  "required": true,
  "content": {
    "application/json": {
      "examples": {
        "custom_with_internal_fallback": {
          "summary": "Proxy customizado com fallback interno",
          "value": {
            "mode": "custom",
            "url": "http://usuario:senha@proxy-do-cliente.example:8080",
            "fallback": "internal"
          }
        },
        "custom_with_explicit_backup_proxy": {
          "summary": "Proxy customizado com proxy de contingência próprio",
          "value": {
            "mode": "custom",
            "url": "http://usuario:senha@proxy-principal.example:8080",
            "fallback": "socks5://backup:senha@proxy-backup.example:1080"
          }
        },
        "internal_now": {
          "summary": "Modo interno",
          "value": {
            "mode": "internal"
          }
        },
        "internal_rotate_now": {
          "summary": "Rotacionar proxy interno agora",
          "value": {
            "mode": "internal",
            "rotate_now": true
          }
        },
        "no_proxy": {
          "summary": "Direto explícito",
          "value": {
            "mode": "none",
            "confirm_no_proxy": true
          }
        }
      },
      "schema": {
        "type": "object",
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "custom",
              "internal",
              "none"
            ],
            "description": "`custom`, `internal` ou `none`. Sem ele, vale `custom` se vier `url`, senão `internal`."
          },
          "url": {
            "type": "string",
            "description": "Seu proxy, obrigatório com `mode=custom`: `http://`, `https://`, `socks5://` ou `socks5h://` (`socks://` não vale). Só com `custom`.",
            "example": "http://usuario:senha@ip:porta"
          },
          "fallback": {
            "type": "string",
            "description": "Só com `mode=custom`: `internal` (padrão), `never` ou a URL de um proxy de contingência (`http://`, `https://`, `socks5://` ou `socks5h://`)."
          },
          "confirm_no_proxy": {
            "type": "boolean",
            "description": "`true` confirma a conexão sem proxy. Obrigatório com `mode=none`; sem ele, `400`."
          },
          "rotate_now": {
            "type": "boolean",
            "description": "`true` troca agora o proxy da Orkesio por outro. Só com `mode=internal`.",
            "default": false
          },
          "country": {
            "type": "string",
            "description": "País do proxy da Orkesio, ISO alpha-2 minúsculo (`value` de `GET /proxy-regions/countries`). Só com `mode=internal`.",
            "example": "br"
          },
          "state": {
            "type": "string",
            "description": "Estado da cidade (`state` de `GET /proxy-regions/cities`), quando a cidade tem.",
            "example": "sp"
          },
          "city": {
            "type": "string",
            "description": "Cidade (`value` de `GET /proxy-regions/cities`).",
            "example": "campinas"
          }
        },
        "additionalProperties": false
      }
    }
  }
}

Respostas

{
  "200": {
    "description": "O proxy salvo.",
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "mode": {
              "type": "string",
              "enum": [
                "custom",
                "internal",
                "none"
              ],
              "description": "O modo salvo: `custom` (proxy seu), `internal` (proxy da Orkesio) ou `none` (sem proxy). Pode diferir do que está em uso agora."
            },
            "effective_mode": {
              "type": "string",
              "enum": [
                "custom",
                "internal",
                "direct"
              ],
              "description": "O que a sessão usa agora: `custom`, `internal` ou `direct` (sem proxy)."
            },
            "effective_detail": {
              "type": "string",
              "enum": [
                "managed_pool",
                "internal_route",
                "relay"
              ],
              "description": "Detalhe do que está em uso: `managed_pool` (proxy da Orkesio), `internal_route` (rota própria do servidor) ou `relay` (proxy pelo celular). Ausente quando não há detalhe."
            },
            "url": {
              "type": "string",
              "description": "A URL do proxy salvo, com usuário e senha mascarados. Com o proxy da Orkesio, vem `managed_pool://hidden`. Numa contingência, continua mostrando a URL salva."
            },
            "fallback": {
              "type": "string",
              "description": "O que fazer se o proxy `custom` falhar: `internal`, `never` ou a URL de outro proxy."
            },
            "last_test_at": {
              "type": "string",
              "format": "date-time",
              "description": "Quando a api testou o proxy ou registrou a última falha. ISO 8601 em UTC com milissegundos; ausente sem teste."
            },
            "last_test_error": {
              "type": "string",
              "description": "A última falha do proxy, para diagnóstico. Vazio sem falha registrada."
            },
            "country": {
              "type": "string",
              "description": "País escolhido para o proxy da Orkesio (ISO alpha-2 minúsculo), vazio sem escolha. Só quando o servidor oferece escolha de região."
            },
            "state": {
              "type": "string",
              "description": "Estado escolhido, vazio sem escolha. Só quando o servidor oferece escolha de região."
            },
            "city": {
              "type": "string",
              "description": "Cidade escolhida, vazia sem escolha. Só quando o servidor oferece escolha de região."
            },
            "reconnecting": {
              "type": "boolean",
              "description": "`true` quando a inbox estava conectada e a api reconecta agora para aplicar."
            },
            "fallback_state": {
              "type": "object",
              "description": "A contingência: ativa quando a inbox saiu da rota escolhida para manter a conexão.",
              "properties": {
                "active": {
                  "type": "boolean",
                  "description": "`true` enquanto a inbox está na contingência."
                },
                "reason": {
                  "type": "string",
                  "description": "Motivo da contingência, em texto técnico (ex.: `custom_failed_internal:dial tcp timeout`). Para diagnóstico."
                },
                "active_since": {
                  "type": "string",
                  "format": "date-time",
                  "description": "Desde quando a contingência está ativa. ISO 8601 em UTC com milissegundos."
                }
              }
            }
          }
        }
      }
    }
  },
  "400": {
    "description": "Pedido inválido: `mode` desconhecido, `url` ausente ou inválida com `custom`, `confirm_no_proxy` ausente com `none`, ou campo de outro modo (`rotate_now`, `country`, `state` e `city` fora de `internal`).",
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/OrkesioError"
        },
        "example": {
          "error": "invalid_request",
          "message": "Pedido inválido: `mode` desconhecido, `proxy_url` ausente ou inválida com `custom`, `confirm_no_proxy` ausente com `none"
        }
      }
    }
  },
  "401": {
    "description": "Token ausente ou inválido.",
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/OrkesioError"
        },
        "example": {
          "error": "unauthorized",
          "message": "Token inválido."
        }
      }
    }
  },
  "409": {
    "description": "Não deu para escolher ou trocar o proxy da Orkesio agora (nenhum disponível na região ou para a troca). Tente de novo ou escolha outra região.",
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/OrkesioError"
        },
        "example": {
          "error": "conflict",
          "message": "Não deu para escolher ou trocar o proxy da Orkesio agora (nenhum disponível na região ou para a troca). Tente de novo ou"
        }
      }
    }
  },
  "429": {
    "$ref": "#/components/responses/RateLimited"
  },
  "500": {
    "description": "Erro interno do servidor ao configurar o proxy",
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/OrkesioError"
        },
        "example": {
          "error": "internal_error",
          "message": "Erro interno do servidor ao configurar o proxy"
        }
      }
    }
  },
  "501": {
    "$ref": "#/components/responses/CloudUnsupported"
  }
}

Estado: Disponível

Compatibilidade de canais

CanalCompatívelObservação
WhatsApp (Web)Sim
WhatsApp (API oficial)NãoSó no WhatsApp Web.
InstagramNão
MessengerNão
TelegramNão

Eventos que esta rota gera

Nenhum. Esta rota não gera evento no webhook (nem em GET /events): o resultado vem só na resposta.

Antes e depois (uazapi → Orkesio)

Na uazapi: POST /instance/proxy.

  • PATCH /inbox/proxy, mesmo corpo.
  • Responde o proxy (o mesmo do GET) com reconnecting (antes details, proxy e restart_requested).
  • proxy_url → url, proxy_fallback → fallback, proxy_managed_* → country, state, city (como no connect); a contingência em fallback_state; sem managed e validation_error.

#/components/schemas/OrkesioError

{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Código estável do erro, em inglês e `snake_case`. Os de uso geral: `invalid_request` (400): pedido inválido: JSON malformado, campo desconhecido ou valor fora do permitido (o detalhe em `message`; o campo em `field`, quando é um só); `unauthorized` (401): `token` ou `admintoken` ausente ou inválido; `forbidden` (403): o token não pode fazer isso (no servidor de demonstração, por exemplo); `not_admin` (403): o WhatsApp recusou por falta de permissão no grupo ou na newsletter; `account_restricted` (403): o WhatsApp restringiu a conta de iniciar conversas novas (mandar para quem já conversa continua valendo; até quando, em `GET /inbox/limits`); `new_chat_limit` (403): a conta atingiu a cota do WhatsApp de conversas novas neste ciclo (veja `GET /inbox/limits`); os dois também no `error` de `OrkesioMessage` e de `message.status`, e não adianta repetir o envio; `payment_required` (403): na API oficial, a Meta recusou o envio por um problema no pagamento da conta do WhatsApp Business (erro 131042 da Meta); acerte a forma de pagamento no gerenciador da Meta, porque repetir não adianta; também no `error` de `OrkesioMessage` e de `message.status`; `whatsapp_rejected` (400): o WhatsApp recusou a mudança pedida (o campo, em `field`, quando é um só); `not_found` (404): o recurso não existe nesta inbox; `conflict` (409): o recurso já existe ou mudou (id em uso, inbox de outro canal); `inbox_not_paired` (409): a inbox ainda não conectou um número; `payload_too_large` (413): o corpo passou do limite; `canceled` e `expired`: só no `error` de `OrkesioMessage` e de `message.status` (envio cancelado antes de sair, ou que passou do prazo na fila); `rate_limited` (429): muitos pedidos; espere o `Retry-After`; `internal_error` (500): falha inesperada na api; tente de novo; `send_failed` (500): o envio falhou (o motivo em `message`); também no `error` de `OrkesioMessage` e de `message.status`; `unsupported_for_channel` (501): o canal da inbox não atende esta rota ou este tipo de mensagem; `meta_error` (502): a Meta recusou ou não respondeu; `disconnected` (503): a inbox está desconectada (sem sessão do WhatsApp, ou token do canal oficial vencido); `unavailable` (503 ou 504): o WhatsApp não respondeu a tempo, ou algo em andamento impede agora; tente de novo. Cada rota lista os códigos próprios dela (`outside_window`, `number_invalid`, `flow_invalid`...). A lista pode crescer: trate código desconhecido pelo status HTTP."
    },
    "message": {
      "type": "string",
      "description": "Descrição para pessoas (às vezes o texto do WhatsApp ou da Meta). Não compare o texto: use `error`."
    },
    "field": {
      "type": "string",
      "description": "O campo do pedido que causou o erro, quando é um só (por exemplo, o campo que o WhatsApp recusou num `PATCH`)."
    }
  },
  "required": [
    "error",
    "message"
  ],
  "additionalProperties": true,
  "description": "O objeto de erro da Orkesio, o mesmo em todo lugar: o corpo das respostas de erro e o `error` de `OrkesioMessage`, `message.status` e `message.failed`. Algumas rotas juntam campos próprios (`request_id`, `errors`...)."
}

#/components/responses/RateLimited

{
  "description": "`rate_limited`: passou do limite de chamadas desta inbox (ou do admin); espere o tempo do header `Retry-After` e tente de novo.",
  "headers": {
    "Retry-After": {
      "description": "Segundos até poder chamar de novo.",
      "schema": {
        "type": "integer",
        "minimum": 1
      }
    }
  },
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/OrkesioError"
      },
      "example": {
        "error": "rate_limited",
        "message": "Muitas requisições."
      }
    }
  }
}

#/components/responses/CloudUnsupported

{
  "description": "`unsupported_for_channel`: o canal da inbox não atende esta rota (rota só do WhatsApp Web numa inbox oficial, ou rota da API oficial numa inbox do WhatsApp Web). O canal está em `Inbox.channel`.",
  "content": {
    "application/json": {
      "schema": {
        "$ref": "#/components/schemas/OrkesioError"
      },
      "example": {
        "error": "unsupported_for_channel",
        "message": "Esta rota não está disponível no canal da inbox."
      }
    }
  }
}

Guias relacionados

Visão geral · O que funciona em cada canal · O que muda da uazapi