GET /accounts/{accountId}/search
Busca full-text ranqueada na conta inteira, usando a coluna gerada `search_tsv` (migration 009) e o índice GIN.
- Access: Signed in
- Service:
https://mail-api.axuz.net
Accepted authentication
sessionCookie— Sessão plena Axuz (cookie de sessão da casa). Sessão restrita é 403 enrollment_required.bearerSession— JWT de acesso da sessão em `Authorization: Bearer`.
Busca full-text ranqueada na conta inteira, usando a coluna gerada search_tsv (migration 009) e o índice GIN.
searchMessages — GET /accounts/{accountId}/search?q=&limit=&offset=.
websearch_to_tsquery e não to_tsquery: o segundo é um parser estrito que LEVANTA ERRO em entrada que não seja uma expressão válida — um usuário digitando contrato & derrubaria a rota em 500. O primeiro aceita qualquer texto, entende a sintaxe que as pessoas já conhecem de buscador ("aspas" para frase, OR, - para excluir) e nunca falha por sintaxe. Numa caixa de entrada, busca que dá erro é pior que busca que não acha nada.
ts_rank_cd (e não ts_rank): leva em conta a proximidade entre os termos, o que importa quando alguém busca duas palavras que espera ver juntas.
Isolamento: o account_id do WHERE vem do path, mas só depois de ownsAccount provar que a conta é do caller — o mesmo gate das outras rotas de mensagem. O predicado no SQL é defense-in-depth: se o gate sumir num refactor, a query ainda não atravessa caixas.
Entradas: accountId no path; q obrigatório; limit (1..200, default 50) e offset (>= 0) opcionais.
Retorno: 200 {items, query, limit, offset}; 400 accountId ou q inválido; 403 conta de outro usuário; 500 erro de banco.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
accountId | path | string | yes |
Responses
200
{items, query, limit, offset}
400
AccountId ou q inválido
| Name | Type | Required | Description |
|---|---|---|---|
error | string | yes |
401
Sem credencial valida
| Name | Type | Required | Description |
|---|---|---|---|
error | string | yes |
403
Sem permissao (nao e owner/admin; token sem escopo; token de integracao em rota nao permitida)
| Name | Type | Required | Description |
|---|---|---|---|
error | string | yes |
429
Limite de requisições excedido.
| Name | Type | Required | Description |
|---|---|---|---|
error | string | yes |
500
Erro de banco
| Name | Type | Required | Description |
|---|---|---|---|
error | string | yes |
Examples
"Try it" is turned off in this reference. Use the examples with your test credential.
curl
curl -sS -X GET 'https://mail-api.axuz.net/accounts/ACCOUNT_ID/search' \
-H "Authorization: Bearer $AXUZ_TOKEN"Node.js
const res = await fetch("https://mail-api.axuz.net/accounts/ACCOUNT_ID/search", {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.AXUZ_TOKEN}`,
},
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
console.log(await res.json());Python
import os
import requests
res = requests.request(
"GET",
"https://mail-api.axuz.net/accounts/ACCOUNT_ID/search",
headers={
"Authorization": f"Bearer {os.environ['AXUZ_TOKEN']}",
},
timeout=30,
)
res.raise_for_status()
print(res.json())