Documentação da API Porto Shop

Guia completo das rotas, autenticação, exemplos e padrões de resposta.

Autenticação

API Key

Todas as requisições à API obrigatoriamente precisam incluir uma API Key no header X-API-KEY.

API_KEY=sua-chave-api-aqui
Token de Autenticação (Bearer Token)

Rotas protegidas requerem um Bearer Token enviado no header Authorization.

Authorization: Bearer {seu-token-aqui}

Headers Obrigatórios

Todos os requests devem incluir:

-H "X-API-KEY: {sua-api-key}"
-H "Authorization: Bearer {token}"
-H "Content-Type: application/json"

Códigos de Status HTTP

Código Significado
200 OK - Requisição bem-sucedida
201 Created - Recurso criado com sucesso
400 Bad Request - Dados inválidos
401 Unauthorized - API Key ou Token inválido/não fornecido
403 Forbidden - Sem permissão para acessar
404 Not Found - Recurso não encontrado
422 Unprocessable Entity - Validação falhou
500 Internal Server Error - Erro no servidor

Rotas Públicas (Auth)

🔐 Login POST /api/auth/login

Autentica um usuário e retorna um token de acesso (Bearer Token).

Request Body (JSON)
{
    "email": "usuario@exemplo.com",
    "password": "sua-senha"
}
Exemplo em Bash (curl)
curl -X POST http://localhost:8001/api/auth/login \
    -H "X-API-KEY: {sua-api-key}" \
    -H "Content-Type: application/json" \
    -d '{
        "email": "usuario@exemplo.com",
        "password": "sua-senha"
    }'

📝 Registrar Usuário POST /api/user/register

Cria um novo usuário. O payload pode incluir campos adicionais do formulário (ex.: documento, data de nascimento, telefone, endereço).

Exemplo (JSON)
{
    "name": "Nome Completo",
    "email": "usuario@exemplo.com",
    "document": "00000000000",
    "birth_date": "YYYY-MM-DD",
    "phone": "(xx) xxxx-xxxx",
    "address": "Endereço completo",
    "password": "senha-segura",
    "password_confirmation": "senha-segura"
}
Exemplo em Bash (form-data)
curl --location "http://localhost:8001/api/user/register" \
  --header "X-API-KEY: {sua-api-key}" \
  --form "name=Nome Completo" \
  --form "email=usuario@exemplo.com" \
  --form "document=00000000000" \
  --form "birth_date=YYYY-MM-DD" \
  --form "phone=(xx) xxxx-xxxx" \
  --form "address=Endereço" \
  --form "password=senha-segura" \
  --form "password_confirmation=senha-segura"

✅ Verificar Email POST /api/user/verify

Verifica o email do usuário usando o código enviado por e-mail. Use valores de placeholder — não exponha tokens reais.

Payload (JSON)
{
    "user_id": 56,
    "email": "usuario@exemplo.com",
    "verification_code": "123456"
}
Exemplo em Bash (form-data)
curl --location "http://localhost:8001/api/user/verify" \
  --header "X-API-KEY: {sua-api-key}" \
  --header "Authorization: Bearer {seu-token}" \
  --form "user_id=56" \
  --form "email=usuario@exemplo.com" \
  --form "verification_code=123456"

📧 Reenviar Email de Verificação POST /api/user/resend-verify-email

Reenvia o email de verificação. Parâmetros comuns: user_id e email.

Payload (JSON)
{
    "user_id": 56,
    "email": "usuario@exemplo.com"
}
Exemplo em Bash (form-data)
curl --location "http://localhost:8001/api/user/resend-verify-email" \
  --header "X-API-KEY: {sua-api-key}" \
  --header "Authorization: Bearer {seu-token}" \
  --form "user_id=56" \
  --form "email=usuario@exemplo.com"

Rotas Protegidas

⚠️ Todas as rotas abaixo requerem autenticação com Token Bearer além da API Key.

👥 Listar Usuários com Filtro GET /api/user/get-users-by-filter

Query parameters: id, name, email, profile_id, is_active, data_de, data_ate, page, page_size

Exemplo de URL
http://localhost:8001/api/user/get-users-by-filter?id=&name=&email=&profile_id=&is_active=&data_de=&data_ate=&page=1&page_size=10
Exemplo em Bash
curl --location --request GET "http://localhost:8001/api/user/get-users-by-filter?id=&name=&email=&profile_id=&is_active=&data_de=&data_ate=&page=1&page_size=10" \
    -H "X-API-KEY: {sua-api-key}" \
    -H "Authorization: Bearer {seu-token}"
Resposta (exemplo)
{
    "success": true,
    "data": [
        {
            "id": 1,
            "email": "admin@portoshop.com",
            "owner": { "id": 1, "name": "ARMANDO THIEL" },
            "isActive": true,
            "createdAt": "2025-12-31T22:22:48.000000Z"
        }
    ],
    "message": "Usuários filtrados com sucesso."
}

➕ Criar Usuário POST /api/user/create
Payload (JSON)
{
    "profile_id": 1,
    "name": "Nome Completo",
    "email": "usuario@exemplo.com",
    "document": "00000000000",
    "birth_date": "YYYY-MM-DD",
    "phone": "(xx) xxxx-xxxx",
    "address": "Endereço completo",
    "password": "senha-segura",
    "password_confirmation": "senha-segura"
}
Exemplo em Bash (form-data)
curl --location "http://localhost:8001/api/user/create" \
    --header "X-API-KEY: {sua-api-key}" \
    --header "Authorization: Bearer {seu-token}" \
    --form "profile_id=1" \
    --form "name=Mae Zulauf" \
    --form "email=Emelia_Osinski@example.net" \
    --form "document=24215507855" \
    --form "birth_date=1946-02-21" \
    --form "phone=758-233-9349" \
    --form "address=565 Schamberger Place" \
    --form "password=admin@321" \
    --form "password_confirmation=admin@321"
Resposta (exemplo)
{
    "success": true,
    "data": {
        "id": 58,
        "email": "usuario@exemplo.com",
        "profileId": 1,
        "isActive": true,
        "verificationCode": "XXXXXX",
        "verificationExpiresAt": "2026-01-14T14:58:59.437080Z"
    },
    "message": "Usuário criado com sucesso"
}

📝 Atualizar Usuário PUT /api/user/{id}
Payload (JSON)
{
    "profile_id": 1,
    "name": "Nome Atualizado",
    "email": "usuario@exemplo.com",
    "document": "00000000000",
    "birth_date": "YYYY-MM-DD",
    "phone": "(xx) xxxx-xxxx",
    "address": "Endereço completo",
    "password": "nova-senha",
    "password_confirmation": "nova-senha"
}
Exemplo em Bash (form-data com _method)
curl --location "http://localhost:8001/api/user/56" \
  --header "X-API-KEY: {sua-api-key}" \
  --header "Authorization: Bearer {seu-token}" \
  --form "profile_id=1" \
  --form "name=Clarence Nader" \
  --form "email=Rudolph_Pouros@example.com" \
  --form "document=43616685664" \
  --form "birth_date=1985-05-10" \
  --form "phone=272-819-1280" \
  --form "address=85311 Darren Light" \
  --form "password=admin@321" \
  --form "password_confirmation=admin@321" \
  --form "_method=PUT"
Resposta (exemplo)
{
    "success": true,
    "data": {
        "id": 56,
        "email": "usuario@exemplo.com",
        "profileId": 1,
        "isActive": true
    },
    "message": "Usuário atualizado com sucesso."
}

🗑️ Deletar Usuário DELETE /api/user/{id}
Exemplo em Bash
curl --location --request DELETE "http://localhost:8001/api/user/59" \
    -H "X-API-KEY: {sua-api-key}" \
    -H "Authorization: Bearer {seu-token}"
Resposta (exemplo)
{
    "success": true,
    "data": null,
    "message": "Usuário excluído com sucesso."
}

📦 Listar Produtos com Filtro GET /api/product/get-products-by-filter

Query parameters: id, name, category_id, unit_id, barcode, is_active, user_id_created, date_de, date_ate, page, page_size

Exemplo de URL
http://localhost:8001/api/product/get-products-by-filter?id=20&name=null&category_id=null&unit_id=null&barcode=null&is_active=null&user_id_created=null&date_de=null&date_ate=null&page=1&page_size=10
Exemplo em Bash
curl --location --request GET "http://localhost:8001/api/product/get-products-by-filter?id=20&name=null&category_id=null&unit_id=null&barcode=null&is_active=null&user_id_created=null&date_de=null&date_ate=null&page=1&page_size=10" \
    -H "X-API-KEY: {sua-api-key}" \
    -H "Authorization: Bearer {seu-token}"
Resposta (exemplo)
{
    "success": true,
    "data": [
        {
            "id": 20,
            "name": "AUDREY OBERBRUNNER",
            "description": null,
            "images": [
                {
                    "id": 28,
                    "product_id": 20,
                    "image": "products/Ii0JFfMR2tCeSsvulbj5t8y16jC6uKExtALg434u.png",
                    "created_at": "2026-01-13 10:44:48",
                    "updated_at": "2026-01-13 10:44:48"
                }
            ],
            "category": { "id": 1, "name": "TECNOLOGIAS" },
            "unit": { "id": 1, "name": "LENA MEDHURST", "abbreviation": "SCSI", "format": "1" },
            "barcode": "GB65RFAZ04098873426923",
            "isActive": true,
            "price": 998,
            "costPrice": 799,
            "stockQuantity": 801,
            "minQuantity": 905,
            "owner": { "id": 1, "name": "ARMANDO THIEL" },
            "userCreated": { "id": 1, "name": "ARMANDO THIEL" },
            "userUpdated": { "id": 1, "name": "ARMANDO THIEL" },
            "userDeleted": null,
            "createdAt": "2026-01-13T07:44:48.000000Z",
            "updatedAt": "2026-01-14T12:30:58.000000Z",
            "deletedAt": null
        }
    ],
    "message": "Produto Filtrado com sucesso."
}

➕ Criar Produto POST /api/product/create
Payload (form-data)
name=Maida
unit_id=1
category_id=1
is_active=1
description=Ray
barcode=MC590930507740VV58028753384
price=98
cost_price=268
stock_quantity=105
min_quantity=838
images[]=@/caminho/imagem1.png
images[]=@/caminho/imagem2.png
Exemplo em Bash
curl --location "http://localhost:8001/api/product/create" \
    --header "X-API-KEY: {sua-api-key}" \
    --header "Authorization: Bearer {seu-token}" \
    --form "name=Maida" \
    --form "unit_id=1" \
    --form "category_id=1" \
    --form "is_active=1" \
    --form "images[]=@imagem1.png" \
    --form "images[]=@imagem2.png" \
    --form "description=Ray" \
    --form "barcode=MC590930507740VV58028753384" \
    --form "price=98" \
    --form "cost_price=268" \
    --form "stock_quantity=105" \
    --form "min_quantity=838"
Resposta (exemplo)
{
    "success": true,
    "data": {
        "id": 24,
        "name": "COLEMAN",
        "description": null,
        "categoryId": 1,
        "unitId": 1,
        "barcode": "ME48004609680580469012",
        "isActive": true,
        "price": 164,
        "costPrice": 388,
        "stockQuantity": 746,
        "minQuantity": 967,
        "images": [
            {
                "product_id": 24,
                "image": "products/kw7ZQREVpMYBBVlxnakrdx6L5PGsmQ2TO5vRH0Ur.png",
                "updated_at": "2026-01-14T15:30:27.000000Z",
                "created_at": "2026-01-14T15:30:27.000000Z",
                "id": 36
            }
        ],
        "userIdCreated": 1,
        "createdAt": "2026-01-14T15:30:26.000000Z",
        "updatedAt": "2026-01-14T15:30:26.000000Z",
        "deletedAt": null
    },
    "message": "Produto criado com sucesso."
}

📝 Atualizar Produto PUT /api/product/{id}
Payload (form-data)
name=Pam Monahan
unit_id=1
category_id=1
is_active=1
description=Legros, Goldner and Kohler
barcode=SK4402375108127003090045
price=487
cost_price=135
stock_quantity=299
min_quantity=193
images[]=@/caminho/imagem.png
_method=PUT
Exemplo em Bash
curl --location "http://localhost:8001/api/product/20" \
    --header "X-API-KEY: {sua-api-key}" \
    --header "Authorization: Bearer {seu-token}" \
    --form "name=Pam Monahan" \
    --form "unit_id=1" \
    --form "category_id=1" \
    --form "is_active=1" \
    --form "images[]=@imagem.png" \
    --form "description=Legros, Goldner and Kohler" \
    --form "barcode=SK4402375108127003090045" \
    --form "price=487" \
    --form "cost_price=135" \
    --form "stock_quantity=299" \
    --form "min_quantity=193" \
    --form "_method=PUT"
Resposta (exemplo)
{
    "success": true,
    "data": {
        "id": 20,
        "name": "AUDREY OBERBRUNNER",
        "description": null,
        "categoryId": 1,
        "unitId": 1,
        "barcode": "GB65RFAZ04098873426923",
        "isActive": true,
        "price": 998,
        "costPrice": 799,
        "stockQuantity": 801,
        "minQuantity": 905,
        "ownerId": 1,
        "images": null,
        "userIdCreated": 1,
        "userIdUpdated": 1,
        "userIdDeleted": null,
        "createdAt": "2026-01-13T10:44:48.000000Z",
        "updatedAt": "2026-01-14T15:30:58.000000Z",
        "deletedAt": null
    },
    "message": "Produto atualizado com sucesso."
}

🗑️ Deletar Produto DELETE /api/product/{id}
Exemplo em Bash
curl --location --request DELETE "http://localhost:8001/api/product/25" \
    -H "X-API-KEY: {sua-api-key}" \
    -H "Authorization: Bearer {seu-token}"
Resposta (exemplo)
{
    "success": true,
    "data": null,
    "message": "Produto excluído com sucesso."
}

📂 Listar Categorias com Filtro GET /api/category/get-categories-by-filter

Query parameters: id, name, page, pageSize

Exemplo de URL
http://localhost:8001/api/category/get-categories-by-filter?id=&name=null&page=1&pageSize=10
Exemplo em Bash
curl --location --request GET "http://localhost:8001/api/category/get-categories-by-filter?id=&name=null&page=1&pageSize=10" \
    -H "X-API-KEY: {sua-api-key}" \
    -H "Authorization: Bearer {seu-token}"
Resposta (exemplo)
{
    "success": true,
    "data": [
        {
            "id": 1,
            "owner": { "id": 1, "name": "ARMANDO THIEL" },
            "name": "TECNOLOGIAS TECNOLOGIAS TECNOLOGIAS TECNOLOGIAS TE",
            "description": "itens tecnologicos",
            "userCreated": { "id": 1, "name": "ARMANDO THIEL" },
            "userUpdated": { "id": 1, "name": "ARMANDO THIEL" },
            "userDeleted": null,
            "createdAt": "2025-12-31T22:24:31.000000Z",
            "updatedAt": "2026-01-09T19:09:25.000000Z",
            "deletedAt": null
        }
    ],
    "message": "Categorias filtradas com sucesso."
}

➕ Criar Categoria POST /api/category/create
Payload (form-data)
name=Alberta Gerlach PhD
description=voluptatem
Exemplo em Bash
curl --location "http://localhost:8001/api/category/create" \
    --header "X-API-KEY: {sua-api-key}" \
    --header "Authorization: Bearer {seu-token}" \
    --form "name=Alberta Gerlach PhD" \
    --form "description=voluptatem"
Resposta (exemplo)
{
    "success": true,
    "data": {
        "id": 12,
        "ownerId": 1,
        "name": "MARCELLA MURAZIK",
        "description": "molestiae",
        "userIdCreated": 1,
        "userIdUpdated": null,
        "userIdDeleted": null,
        "createdAt": "2026-01-14T15:40:14.000000Z",
        "updatedAt": "2026-01-14T15:40:14.000000Z",
        "deletedAt": null
    },
    "message": "Categoria criada com sucesso."
}

📝 Atualizar Categoria PUT /api/category/{id}
Payload (form-data)
name=Julio Frami
description=Ratione quas debitis asperiores...
_method=PUT
Exemplo em Bash
curl --location "http://localhost:8001/api/category/10" \
    --header "X-API-KEY: {sua-api-key}" \
    --header "Authorization: Bearer {seu-token}" \
    --form "_method=PUT" \
    --form "name=Julio Frami" \
    --form "description=Ratione quas debitis asperiores..."

🗑️ Deletar Categoria DELETE /api/category/{id}
Exemplo em Bash
curl --location --request DELETE "http://localhost:8001/api/category/13" \
    -H "X-API-KEY: {sua-api-key}" \
    -H "Authorization: Bearer {seu-token}"
Resposta (exemplo)
{
    "success": true,
    "data": null,
    "message": "Categoria excluída com sucesso."
}

📏 Listar Unidades com Filtro GET /api/unit/get-units-by-filter

Query parameters: name, abbreviation, format, page, page_size

Exemplo de URL
http://localhost:8001/api/unit/get-units-by-filter?name=null&abbreviation=null&format=null&page=1&page_size=10
Exemplo em Bash
curl --location "http://localhost:8001/api/unit/get-units-by-filter?name=null&abbreviation=null&format=null&page=1&page_size=10" \
    -H "X-API-KEY: {sua-api-key}" \
    -H "Authorization: Bearer {seu-token}"
Resposta (exemplo)
{
    "success": true,
    "data": [
        {
            "id": 1,
            "owner": { "id": 1, "name": "ARMANDO THIEL" },
            "name": "LENA MEDHURST",
            "abbreviation": "SCSI",
            "format": 1,
            "userCreated": { "id": 1, "name": "ARMANDO THIEL" },
            "userUpdated": { "id": 1, "name": "ARMANDO THIEL" },
            "userDeleted": null,
            "createdAt": "2025-12-31T22:25:52.000000Z",
            "updatedAt": "2026-01-05T15:11:00.000000Z",
            "deletedAt": null
        }
    ],
    "message": "Unidades filtradas com sucesso."
}

➕ Criar Unidade POST /api/unit/create
Payload (form-data)
name=Harvey Crona
abbreviation=PCI
format=1
Exemplo em Bash
curl --location "http://localhost:8001/api/unit/create" \
    --header "X-API-KEY: {sua-api-key}" \
    --header "Authorization: Bearer {seu-token}" \
    --form "name=Harvey Crona" \
    --form "abbreviation=PCI" \
    --form "format=1"
Resposta (exemplo)
{
    "success": true,
    "data": {
        "id": 16,
        "ownerId": 1,
        "name": "ERIK SAWAYN III",
        "abbreviation": "COM",
        "format": 1,
        "userIdCreated": 1,
        "userIdUpdated": null,
        "userIdDeleted": null,
        "createdAt": "2026-01-14T15:45:20.000000Z",
        "updatedAt": "2026-01-14T15:45:20.000000Z",
        "deletedAt": null
    },
    "message": "Unidade criada com sucesso."
}

📝 Atualizar Unidade PUT /api/unit/{id}
Payload (form-data)
name=Victoria Dietrich III
abbreviation=COM
format=1
_method=PUT
Exemplo em Bash
curl --location "http://localhost:8001/api/unit/5" \
    --header "X-API-KEY: {sua-api-key}" \
    --header "Authorization: Bearer {seu-token}" \
    --form "_method=PUT" \
    --form "name=Victoria Dietrich III" \
    --form "abbreviation=COM" \
    --form "format=1"
Resposta (exemplo)
{
    "success": true,
    "data": {
        "id": 5,
        "ownerId": 1,
        "name": "BEATRICE LITTEL",
        "abbreviation": "RAM",
        "format": 1,
        "userIdCreated": 1,
        "userIdUpdated": 1,
        "userIdDeleted": null,
        "createdAt": "2026-01-05T01:59:00.000000Z",
        "updatedAt": "2026-01-14T15:47:11.000000Z",
        "deletedAt": null
    },
    "message": "Unidade atualizada com sucesso."
}

🗑️ Deletar Unidade DELETE /api/unit/{id}
Exemplo em Bash
curl --location --request DELETE "http://localhost:8001/api/unit/17" \
    -H "X-API-KEY: {sua-api-key}" \
    -H "Authorization: Bearer {seu-token}"
Resposta (exemplo)
{
    "success": true,
    "data": null,
    "message": "Unidade excluída com sucesso."
}

👤 Listar Perfis com Filtro GET /api/profile/get-profiles-by-filter

Query parameters: id, name, page, page_size

Exemplo de URL
http://localhost:8001/api/profile/get-profiles-by-filter?id=null&name=null&page=1&page_size=10
Exemplo em Bash
curl --location "http://localhost:8001/api/profile/get-profiles-by-filter?id=null&name=null&page=1&page_size=10" \
    -H "X-API-KEY: {sua-api-key}" \
    -H "Authorization: Bearer {seu-token}"
Resposta (exemplo)
{
    "success": true,
    "data": [
        {
            "id": 1,
            "owner": { "id": 1, "name": "ARMANDO THIEL" },
            "name": "VENDEDOR",
            "description": "Criar produtos e gerenciar",
            "permission": "dashboardcontroller@index,productcontroller@index,productcontroller@show,productcontroller@store,productcontroller@update,productcontroller@destroy,userprofilecontroller@edit,userprofilecontroller@update",
            "userCreated": { "id": 1, "name": "ARMANDO THIEL" },
            "userUpdated": { "id": 1, "name": "ARMANDO THIEL" },
            "userDeleted": null,
            "createdAt": "2025-12-31T22:24:09.000000Z",
            "updatedAt": "2025-12-31T23:07:25.000000Z",
            "deletedAt": null
        }
    ],
    "message": "Perfis filtrados com sucesso."
}

➕ Criar Perfil POST /api/profile/create
Payload (form-data)
name=Robin Mante
description=Brazilian Real
permissions=["unitcontroller@index","productcontroller@update",
  "categorycontroller@destroy","categorycontroller@store",
  "userprofilecontroller@update"]
Exemplo em Bash
curl --location "http://localhost:8001/api/profile/create" \
    --header "X-API-KEY: {sua-api-key}" \
    --header "Authorization: Bearer {seu-token}" \
    --form "name=Robin Mante" \
    --form "description=Brazilian Real" \
    --form "permissions=[\"unitcontroller@index\",\"productcontroller@update\"]"
Resposta (exemplo)
{
    "success": true,
    "data": {
        "id": 9,
        "ownerId": 1,
        "name": "MR. KELLY DICKENS",
        "description": "Vatu",
        "permission": "unitcontroller@store,productcontroller@index,userprofilecontroller@update,productcontroller@update,categorycontroller@update",
        "userIdCreated": 1,
        "userIdUpdated": null,
        "userIdDeleted": null,
        "createdAt": "2026-01-14T15:52:09.000000Z",
        "updatedAt": "2026-01-14T15:52:09.000000Z",
        "deletedAt": null
    },
    "message": "Perfil criado com sucesso."
}

📝 Atualizar Perfil PUT /api/profile/{id}
Payload (form-data)
name=Ricky Corwin
description=Kroon
permissions=["usercontroller@update","usercontroller@index",
  "productcontroller@update","productcontroller@show",
  "profilecontroller@update"]
_method=PUT
Exemplo em Bash
curl --location "http://localhost:8001/api/profile/5" \
    --header "X-API-KEY: {sua-api-key}" \
    --header "Authorization: Bearer {seu-token}" \
    --form "name=Ricky Corwin" \
    --form "description=Kroon" \
    --form "permissions=[\"usercontroller@update\",\"usercontroller@index\"]" \
    --form "_method=PUT"
Resposta (exemplo)
{
    "success": true,
    "data": {
        "id": 5,
        "ownerId": 1,
        "name": "lynn champlin",
        "description": "Pa'anga",
        "permission": "profilecontroller@store,categorycontroller@update,profilecontroller@index,productcontroller@update,userprofilecontroller@update",
        "userIdCreated": 1,
        "userIdUpdated": 1,
        "userIdDeleted": null,
        "createdAt": "2026-01-13T19:35:35.000000Z",
        "updatedAt": "2026-01-14T15:52:31.000000Z",
        "deletedAt": null
    },
    "message": "Perfil atualizado com sucesso."
}

🗑️ Deletar Perfil DELETE /api/profile/{id}
Exemplo em Bash
curl --location --request DELETE "http://localhost:8001/api/profile/10" \
    -H "X-API-KEY: {sua-api-key}" \
    -H "Authorization: Bearer {seu-token}"
Resposta (exemplo)
{
    "success": true,
    "data": null,
    "message": "Perfil excluído com sucesso."
}