API do Lab

Referência da API REST do AppsQuality Lab. Base URL: https://appsquality.com.br/wp-json/aq-lab/v1. Especificação completa em openapi.json (importável no Postman, Insomnia ou Swagger UI).

Ambiente público de testes: dados fictícios, temporários (1 h) e isolados por token. Não envie dados pessoais reais.

Autenticação

Faça POST /auth/login com {"username":"standard_user","password":"qa@12345"}. A resposta traz token (válido por 1 hora). Envie-o em Authorization: Bearer <token> ou, se um proxy remover esse cabeçalho, em X-Lab-Token. Endpoints marcados com 🔒 exigem token.

Formato de erro

Todos os erros seguem o mesmo formato. Em validação (422) vem a lista errors com um item por campo.

{
  "status": 422,
  "code": "validation_error",
  "message": "Verifique os campos destacados.",
  "errors": [
    { "field": "email", "message": "E-mail inválido." }
  ]
}
CódigoQuando acontece
200 / 201 / 204Sucesso; 201 ao criar (com cabeçalho Location); 204 em exclusões e logout
400Corpo ou parâmetros inválidos, JSON malformado, carrinho vazio no checkout
401Token ausente, inválido ou expirado; credenciais erradas no login
403Tentativa de alterar ou excluir registro de exemplo somente leitura (id 1 de contatos e reservas)
404Rota, produto, item ou registro inexistente
409Conflito: produto esgotado, quantidade indisponível, e-mail já cadastrado, limite de registros
413Corpo maior que 16 KB
422Validação por campo
423Usuário bloqueado (locked_user)
429Limite de 120 requisições/min por IP (veja Retry-After)
500Falha simulada do error_user no checkout

Cabeçalhos úteis

  • X-Total-Count e X-Total-Pages nas listagens paginadas (?page= e ?per_page=, máx. 50).
  • X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset em todas as respostas.
  • CORS liberado (Access-Control-Allow-Origin: *) apenas neste namespace, sem cookies.

Autenticação

Login com usuários fictícios e token Bearer de 1 hora.

MétodoRotaDescriçãoRespostas
POST/auth/loginLogin com usuário de teste. Senha comum: qa@12345. Usuários: standard_user, locked_user, slow_user, problem_user, error_user. O token vale 1 hora.200, 400, 401, 423, 429
GET/auth/me 🔒Dados do usuário do token.200, 401, 429
POST/auth/logout 🔒Encerra o token.204, 401, 429
POST/reset 🔒Restaura os dados do token ao estado inicial.200, 401, 429
GET/usersLista os usuários de teste e seus comportamentos.200, 429

Catálogo

Produtos fixos da QA Store (públicos; com token, os bugs do problem_user aparecem).

MétodoRotaDescriçãoRespostas
GET/productsLista produtos. Com token do problem_user, os bugs propositais aparecem (imagens erradas, price_desc ignorado).200, 400, 429
GET/products/{id}Detalhe do produto.200, 404, 429
GET/categoriesLista categorias.200, 429

Carrinho e pedidos

Dados isolados por token.

MétodoRotaDescriçãoRespostas
GET/cart 🔒Carrinho do token.200, 401, 429
POST/cart 🔒Adiciona produto ao carrinho. Soma à quantidade existente. Máximo de 10 unidades por produto (ou o estoque).201, 404, 409, 422, 401, 429
DELETE/cart 🔒Esvazia o carrinho.204, 401, 429
PATCH/cart/{id} 🔒Altera a quantidade (0 remove).200, 404, 409, 422, 401, 429
DELETE/cart/{id} 🔒Remove o produto do carrinho.204, 404, 401, 429
POST/checkout 🔒Finaliza a compra. Valida nome, sobrenome e CEP (8 dígitos). Frete fictício: grátis a partir de R$ 200, senão R$ 19,90. Com error_user, falha com 500 nas tentativas ímpares.201, 400, 409, 422, 500, 401, 429
GET/orders 🔒Lista pedidos do token (mais novo primeiro).200, 401, 429
GET/orders/{id} 🔒Detalhe do pedido.200, 404, 401, 429

Exemplo de corpo para POST /cart:

{
  "productId": 1,
  "qty": 2
}

Exemplo de corpo para POST /checkout:

{
  "firstName": "Maria",
  "lastName": "Teste",
  "zipCode": "01234-567"
}

Contatos

CRUD com validação por campo (422) e conflito de e-mail (409).

MétodoRotaDescriçãoRespostas
GET/contacts 🔒Lista contatos.200, 401, 429
POST/contacts 🔒Cria contato. Obrigatórios: firstName, lastName, email, phone (10 ou 11 dígitos, máscara opcional). E-mail único por token.201, 409, 422, 401, 429
GET/contacts/{id} 🔒Detalhe do contato.200, 404, 401, 429
PUT/contacts/{id} 🔒Substitui o contato (todos os campos obrigatórios).200, 403, 404, 409, 422, 401, 429
PATCH/contacts/{id} 🔒Atualiza campos do contato.200, 403, 404, 409, 422, 401, 429
DELETE/contacts/{id} 🔒Exclui o contato.204, 403, 404, 401, 429

Exemplo de corpo para POST /contacts:

{
  "firstName": "Maria",
  "lastName": "Teste",
  "email": "maria.teste@example.test",
  "phone": "(11) 91234-5678",
  "company": "Empresa Fictícia",
  "notes": "Contato de exemplo"
}

Reservas

CRUD de reservas de hotel fictício com regras de datas e preço.

MétodoRotaDescriçãoRespostas
GET/bookings 🔒Lista reservas.200, 401, 429
POST/bookings 🔒Cria reserva. checkin < checkout; totalPrice >= 0; roomType: standard, luxo ou suite.201, 409, 422, 401, 429
GET/bookings/{id} 🔒Detalhe da reserva.200, 404, 401, 429
PUT/bookings/{id} 🔒Substitui a reserva.200, 403, 404, 422, 401, 429
PATCH/bookings/{id} 🔒Atualiza campos da reserva.200, 403, 404, 422, 401, 429
DELETE/bookings/{id} 🔒Exclui a reserva.204, 403, 404, 401, 429

Exemplo de corpo para POST /bookings:

{
  "guestName": "Joana Teste",
  "roomType": "luxo",
  "checkin": "2030-01-10",
  "checkout": "2030-01-12",
  "totalPrice": 520.0,
  "depositPaid": true,
  "notes": "Café da manhã"
}

Utilitários HTTP

Endpoints didáticos para treinar status, atrasos, cabeçalhos e corpo.

MétodoRotaDescriçãoRespostas
GET/statusHealth check.200, 429
GET/http/status/{code}Devolve o status pedido (100–599). Também aceita POST, PUT, PATCH e DELETE. 1xx devolve 200 com explicação (não pode ser resposta final); 3xx de redirecionamento traz Location.200, 400, 429
GET/http/delay/{s}Responde após s segundos (0–5).200, 400, 429
GET/http/headersEcoa os cabeçalhos da requisição. Authorization, Cookie, X-AQ-Authorization, X-Lab-Token e Proxy-Authorization são removidos da resposta.200, 429
POST/http/echoEcoa o corpo JSON. Também aceita PUT e PATCH. Limite de 16 KB.200, 400, 413, 429
GET/openapi.jsonEsta especificação.200, 429

Usuários de teste

UsuárioComportamento
standard_userTudo funciona como esperado.
locked_userO login sempre responde 423 (conta bloqueada).
slow_userLogin e todas as requisições autenticadas demoram cerca de 3 segundos.
problem_userBugs de propósito: todas as imagens são a mesma figura quebrada; a ordenação price_desc é ignorada; adicionar o produto 7 coloca o 8 no carrinho; o sobrenome some do pedido.
error_userO checkout falha com 500 nas tentativas ímpares (1ª, 3ª…) e funciona nas pares.