Profile Server API
Endpoints

Organizations

CRUD de organizações (cooperativas), a raiz do agregado de endereços e contatos.

Organizações / cooperativas. Raiz do agregado que inclui endereços e contatos. Base path: /api/organizations · autenticação de usuário. Consulta e criação também estão disponíveis app-to-app em /service/organizations — ver App-to-app.

MétodoRotaScopeResourceSucesso
POST/api/organizationscreateresource:organizations201
GET/api/organizationsreadresource:organizations200
GET/api/organizations/:idreadresource:organizations_id200
PUT/api/organizations/:idupdateresource:organizations_id200
DELETE/api/organizations/:iddeleteresource:organizations_id204

Criar organização

POST /api/organizationstransacional: cria a organização, o endereço vigente (obrigatório) e os contatos (opcionais) numa única operação tudo-ou-nada. Não é possível criar uma organização sem endereço.

Corpo

CampoTipoObrigatórioRegras
namestringsimmín. 1 caractere
aliasstringnãoou null
federalTaxIdstringsim11 a 14 caracteres; único (409)
stateTaxIdstringnãoou null
municipalTaxIdstringnãoou null
logoPathstringnãoou null
activebooleannãopadrão true
listedbooleannãopadrão true (visível publicamente)
metadataobjectnãomapa livre; ou null
addressobjectsimendereço vigente inicial (ver abaixo)
contactsarraynãocontatos iniciais (ver abaixo)

address (obrigatório)

CampoTipoObrigatórioRegras
zipCodestringsimexatamente 8 caracteres (CEP)
streetstringsimmín. 1 caractere
numberstringsimmín. 1 caractere
complementstringnãoou null
districtstringnãomáx. 50; ou null
cityCodeintegersimcódigo IBGE; cidade existente (400)
stateCodeintegersimestado existente (400); a cidade deve pertencer a ele (400)
countrystringnãopadrão Brasil
latitudenumbernãoou null
longitudenumbernãoou null

contacts[] (opcional)

CampoTipoObrigatórioRegras
typeenumsimPHONE | EMAIL | URL
valuestringsimmín. 1 caractere
descriptionstringnãoou null
isPrimarybooleannãopadrão false
curl -X POST http://localhost:3000/api/organizations \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Cooperativa Recicla Já",
    "alias": "Recicla Já",
    "federalTaxId": "12345678000190",
    "address": {
      "zipCode": "01310100",
      "street": "Avenida Paulista",
      "number": "1000",
      "district": "Bela Vista",
      "cityCode": 3550308,
      "stateCode": 35
    },
    "contacts": [
      { "type": "EMAIL", "value": "contato@reciclaja.org", "isPrimary": true }
    ]
  }'

201 Created — retorna a organização (com organizationAddressId já apontando para o endereço criado). Endereços e contatos são consultados nos seus próprios recursos.

{
  "id": "o1b2c3d4-e5f6-4789-a123-456789abcdef",
  "name": "Cooperativa Recicla Já",
  "alias": "Recicla Já",
  "federalTaxId": "12345678000190",
  "stateTaxId": null,
  "municipalTaxId": null,
  "logoPath": null,
  "active": true,
  "listed": true,
  "metadata": null,
  "organizationAddressId": "a1b2c3d4-e5f6-4789-a123-456789abcdef",
  "createdAt": "2026-07-13T12:00:00.000Z",
  "updatedAt": "2026-07-13T12:00:00.000Z"
}

409 Conflict — já existe uma organização com esse federalTaxId.

400 Bad Request — endereço inválido: stateCode ou cityCode inexistente, ou a cidade não pertence ao estado informado. Como é transacional, nada é criado nesses casos.

Depois de criada, endereços (com histórico de vigência) e contatos são gerenciados pelos recursos organization-addresses e organization-contacts.


Listar organizações

GET /api/organizations — lista paginada (page, limit).

Filtros opcionais: name (contém), active (true | false), listed (true | false).


Obter organização por id

GET /api/organizations/:id404 se não existir.


Editar organização

PUT /api/organizations/:id — atualização parcial. O federalTaxId não é editável.

CampoTipoRegras
namestringmín. 1 caractere
aliasstringou null
stateTaxIdstringou null
municipalTaxIdstringou null
logoPathstringou null
activeboolean
listedboolean
metadataobjectou null

Retorna 200; 404 se não existir.


Remover organização

DELETE /api/organizations/:idsoft delete (deletedAt). Retorna 204 No Content. Organizações removidas deixam de aparecer nas listagens e buscas.


App-to-app (/service)

Além do prefixo /api (usuário final), a consulta e a criação de organizações também estão disponíveis para serviços (app-to-app), autenticados pelo ServiceAuthMiddleware (client credentials do Keycloak). São os mesmos use case, validações e formato dos endpoints /api — muda só o prefixo e o mecanismo de autenticação; aqui não há o PermissionGuard por escopo de usuário.

MétodoRotaSucessoEquivale a
GET/service/organizations200GET /api/organizations
POST/service/organizations201POST /api/organizations
  • GET /service/organizations — mesma paginação e filtros (page, limit, name, active, listed) e o mesmo envelope de resposta.
  • POST /service/organizations — mesmo corpo transacional (organização + address obrigatório + contacts opcionais) e os mesmos erros (409 para federalTaxId duplicado, 400 para endereço inválido).

Obter por id, editar e remover não têm variante /service — apenas consulta e criação.