API Reference · Identidade e acesso

Convenções

As rotas protegidas recebem Authorization: Bearer <credencial>. A API aceita JWT próprio, JWT Appwrite e token de sistema conforme a operação. A autorização dos recursos permanece nas ACLs da API. Os erros usam o corpo abaixo. Cada tabela de erros declara o status, o código confirmado e a condição. Quando um status possui causas diferentes, a tabela separa cada variante confirmada. O formato abaixo vale para os erros produzidos pela aplicação; exceções do próprio framework sem código explícito podem não incluir errorCode.

Corpo de erro — JSON

CampoTipoPresençaDescrição
statusCodenumberSempreRepete o status HTTP.
messagestring ou array de stringsSempreMensagem legível; validação pode retornar várias mensagens.
errorCodestringCondicionalCódigo estável nos erros emitidos pela aplicação; pode faltar em exceção do framework sem código explícito.
errorstringCondicionalNome do status HTTP; ausente em algumas exceções com corpo textual.

Cadastro de Pessoa e conta

POST /v1/people

Cria uma Pessoa. Com account, cadastra também a conta vinculada e provisiona a identidade no Appwrite.

Autenticação e autorização: Bearer de Pessoa com Acesso de Núcleo ou superior. A criação da conta requer Acesso Global e Pessoa física com papel USER ou ASSOCIATE.

Entrada — JSON

LocalCampoTipoObrigatórioCondição
CorpopersonTypeFISICA ou JURIDICACondicionalCom account, informe FISICA.
Corponame / companyNamestringCondicionalInforme nome ou razão social.
Corporolesarray de papéisCondicionalCom account, inclui USER ou ASSOCIATE.
Corpoaccount.emaile-mail, até 254 caracteresCom accountE-mail de acesso.
Corpoaccount.passwordstring, 8 a 72 caracteresCom accountCredencial provisionada no Appwrite.
Corpoaccount.accessProfilePerfil de AcessoCom accountPerfil concedido pelo operador.
CorpocpfCnpjstring ou nullNãoCPF/CNPJ válido, normalizado para dígitos.
CorpohasNoCpfCnpjbooleanNãoIncompatível com cpfCnpj.
CorponoCpfCnpjReasonstring ou null, até 120 caracteresNãoMotivo da ausência de documento.
Corpoidentifierstring ou null, até 40 caracteresNãoIdentificador livre.
CorpoidentityStatusestado da identidadeNãoEstado da identidade da Pessoa.
CorpopossibleDuplicateOfarray de UUIDsNãoPessoas candidatas a duplicata.
Corponucleosarray de siglasNãoNúcleos responsáveis; siglas normalizadas.
CorpoportfolioIdUUIDCom CLIENTCarteira do novo cliente.
CorpoportfolioEffectiveFromdata civil YYYY-MM-DDCom CLIENTInício do vínculo com a Carteira.
CorpooriginUoSiglastring ou null, até 40 caracteresCom CLIENTUnidade de origem; sigla normalizada.
CorpooriginDatedata civil YYYY-MM-DD ou nullCom CLIENTData de entrada pela unidade de origem.
CorpooriginationTypetipo de originação ou nullNãoTipo da origem.
CorpooriginCitystring ou null, até 120 caracteresNãoCidade de origem.
CorporeferredByPersonIdUUID ou nullNãoPessoa indicadora.
CorporeferralTypetipo de indicação ou nullNãoRequer referredByPersonId.
CorporeferralChannelcanal de indicação ou nullNãoCanal de chegada.
CorpobirthDatedata civil YYYY-MM-DD ou nullNãoNascimento.
Corpogendergênero ou nullNãoGênero declarado.
CorpogeneralNotesstring ou null, até 5000 caracteresNãoObservações gerais.
Corpophonesarray de telefonesNãoCada item aceita phoneType, number, isPrimary, ownership e contactChannel; number obrigatório.
Corpoemailsarray de e-mailsNãoCada item aceita emailType, email e isPrimary; email obrigatório.
Corpoaddressesarray de endereçosNãoCada item aceita addressType, zipCode, street, number, complement, district, city, state, isPrimary, referencePoints.
Corpodocumentsarray de documentosNãoCada item aceita documentType, number, issuingAuthority, issueDate.

Itens das listas de entrada

Cada lista é opcional. Para cada item enviado, os campos seguem o contrato abaixo.

CampoTipoObrigatório no itemDescrição
phones[].phoneTypestring ou null, até 40 caracteresNãoTipo do telefone.
phones[].numberstring, até 30 caracteresSimNúmero do telefone.
phones[].isPrimaryboolean ou nullNãoMarca telefone principal.
phones[].ownershipenum ou nullNãoTitularidade.
phones[].contactChannelenum ou nullNãoCanal de contato.
emails[].emailTypestring ou null, até 40 caracteresNãoTipo do e-mail.
emails[].emaile-mail, até 255 caracteresSimEndereço de e-mail.
emails[].isPrimaryboolean ou nullNãoMarca e-mail principal.
addresses[].addressTypestring ou null, até 40 caracteresNãoTipo do endereço.
addresses[].zipCodestring ou null, até 12 caracteresNãoCEP.
addresses[].streetstring ou null, até 255 caracteresNãoLogradouro.
addresses[].numberstring ou null, até 20 caracteresNãoNúmero.
addresses[].complementstring ou null, até 120 caracteresNãoComplemento.
addresses[].districtstring ou null, até 120 caracteresNãoBairro.
addresses[].citystring ou null, até 120 caracteresNãoCidade.
addresses[].statestring ou null, até 4 caracteresNãoUF.
addresses[].isPrimaryboolean ou nullNãoMarca endereço principal.
addresses[].referencePointsarray de até 5 stringsNãoPontos de referência; cada um até 120 caracteres.
documents[].documentTypestring ou null, até 60 caracteresNãoTipo do documento.
documents[].numberstring ou null, até 60 caracteresNãoNúmero do documento.
documents[].issuingAuthoritystring ou null, até 120 caracteresNãoÓrgão emissor.
documents[].issueDatedata civil YYYY-MM-DD ou nullNãoData de emissão.

Saída

HTTPCampoTipoDescrição
201idUUIDID da Pessoa.
201personTypeFISICA, JURIDICA ou nullNatureza da Pessoa.
201namestring ou nullNome da Pessoa física.
201companyNamestring ou nullRazão social.
201cpfCnpjstring ou nullCPF/CNPJ normalizado para dígitos.
201hasNoCpfCnpjbooleanDeclara ausência de CPF/CNPJ.
201noCpfCnpjReasonstring ou nullJustificativa da ausência.
201identifierstring ou nullIdentificador livre.
201identityStatusestado da identidadeEstado da identidade.
201possibleDuplicateOfarray de UUIDsCandidatos a duplicata.
201nucleosarray de siglasNúcleos responsáveis.
201rolesarray de papéisPapéis institucionais.
201originUoSiglastring ou nullUnidade de origem.
201originDatedata civil ou nullData de origem.
201originationTypetipo de originação ou nullComo a origem foi estabelecida.
201originCitystring ou nullCidade de origem.
201referredByPersonIdUUID ou nullPessoa indicadora.
201referralTypetipo de indicação ou nullQualificação da indicação.
201referralChannelcanal de indicação ou nullCanal de chegada.
201birthDatedata civil ou nullData de nascimento.
201gendergênero ou nullGênero declarado.
201generalNotesstring ou nullObservações gerais.
201isClientboolean ou nullIndicador derivado dos processos.
201isOpposingPartyboolean ou nullIndicador derivado dos processos.
201authorUserIdUUID ou nullAutor do cadastro.
201portfolioIdUUID ou nullCarteira vigente.
201phonesarray de PersonPhoneTelefones cadastrados.
201emailsarray de PersonEmailE-mails cadastrados.
201addressesarray de PersonAddressEndereços cadastrados.
201documentsarray de PersonIdDocumentDocumentos cadastrados.
201createdAtdata e hora ISO 8601Criação.
201updatedAtdata e hora ISO 8601Última atualização.
201accountobjeto ou nullnull quando a conta não foi solicitada.
201account.idUUIDIdentificador da conta.
201account.emailstringE-mail normalizado.
201account.accessProfilePerfil de AcessoPerfil concedido.
201account.activebooleanEstado da conta.

Itens das listas de saída

Cada item salvo inclui os campos públicos abaixo. personId e a relação interna person ficam fora da resposta.

CampoTipoDescrição
phones[].idUUIDIdentificador do item.
phones[].phoneTypestring ou nullTipo do telefone.
phones[].numberstringNúmero do telefone.
phones[].isPrimaryboolean ou nullMarca telefone principal.
phones[].ownershipenum ou nullTitularidade.
phones[].contactChannelenum ou nullCanal de contato.
phones[].createdAtdata e hora ISO 8601Criação do item.
emails[].idUUIDIdentificador do item.
emails[].emailTypestring ou nullTipo do e-mail.
emails[].emaile-mailEndereço de e-mail.
emails[].isPrimaryboolean ou nullMarca e-mail principal.
emails[].createdAtdata e hora ISO 8601Criação do item.
addresses[].idUUIDIdentificador do item.
addresses[].addressTypestring ou nullTipo do endereço.
addresses[].zipCodestring ou nullCEP.
addresses[].streetstring ou nullLogradouro.
addresses[].numberstring ou nullNúmero.
addresses[].complementstring ou nullComplemento.
addresses[].districtstring ou nullBairro.
addresses[].citystring ou nullCidade.
addresses[].statestring ou nullUF.
addresses[].isPrimaryboolean ou nullMarca endereço principal.
addresses[].referencePointsarray de stringsPontos de referência; cada um até 120 caracteres.
addresses[].createdAtdata e hora ISO 8601Criação do item.
documents[].idUUIDIdentificador do item.
documents[].documentTypestring ou nullTipo do documento.
documents[].numberstring ou nullNúmero do documento.
documents[].issuingAuthoritystring ou nullÓrgão emissor.
documents[].issueDatedata civil YYYY-MM-DD ou nullData de emissão.
documents[].createdAtdata e hora ISO 8601Criação do item.

Erros

HTTPerrorCodeCondição
400VALIDATION_FAILEDCorpo inválido, inclusive CPF/CNPJ ou papel inválido.
401UNAUTHORIZEDCredencial ausente ou inválida.
403FORBIDDENPerfil insuficiente ou concessão de perfil não autorizada.
404NOT_FOUNDCarteira informada para papel CLIENT inexistente.
404APPWRITE_NOT_FOUNDAppwrite devolveu 404 durante o provisionamento ou a verificação do e-mail.
409CONFLICTCPF/CNPJ ou e-mail da conta já cadastrado.
422RULE_VIOLATIONCondição de domínio não atendida, inclusive conta sem Pessoa física ou papel elegível.
500INTERNALFalha de persistência ou configuração do provedor de mutação.
500APPWRITE_CREDENTIALSCredenciais da integração Appwrite recusadas.
502APPWRITE_UPSTREAMAppwrite retornou falha ou houve erro de rede durante o provisionamento.
503UPSTREAM_UNAVAILABLEIntegração Appwrite desabilitada para cadastro com conta.
504APPWRITE_TIMEOUTPrazo da integração Appwrite excedido.

Autenticação local

POST /v1/auth/login

Autentica uma conta local e emite JWT da API. Contas vinculadas ao Appwrite usam a sessão do provedor.

Autenticação e autorização: operação pública; limite de cinco tentativas por minuto por IP.

Entrada — JSON

LocalCampoTipoObrigatórioCondição
Corpoemaile-mail, até 254 caracteresSimE-mail de acesso.
Corpopasswordstring, 1 a 72 caracteresSimSenha da conta local.

Saída

HTTPCampoTipoDescrição
200accessTokenstringJWT para Bearer.
200expiresInnumberValidade em segundos.

Erros

HTTPerrorCodeCondição
400VALIDATION_FAILEDCorpo inválido.
401UNAUTHORIZEDCredenciais inválidas, conta inativa ou conta Appwrite.
403ACCESS_PROFILE_UNMAPPEDConta sem Perfil de Acesso convertido.
429RATE_LIMITEDLimite de tentativas excedido.

GET /v1/users/me

Retorna a conta da Pessoa autenticada e seus vínculos com núcleos.

Autenticação e autorização: Bearer JWT próprio ou Appwrite; token de sistema não representa Pessoa.

Entrada

LocalCampoTipoObrigatórioCondição
CabeçalhoAuthorizationBearer JWTSimCredencial de Pessoa.

Saída

HTTPCampoTipoDescrição
200idUUIDID da conta.
200personIdUUID ou nullPessoa titular; nulo para conta legada sem vínculo.
200emailstringE-mail da conta.
200namestringNome de exibição.
200accessProfilePerfil de AcessoPerfil efetivo.
200nucleiarrayNúcleos da Pessoa; vazio sem vínculos.
200nuclei[].siglastringSigla do núcleo.
200nuclei[].rolepapel no núcleoPapel no vínculo.

Erros

HTTPerrorCodeCondição
401UNAUTHORIZEDCredencial ausente ou inválida.
403FORBIDDENToken de sistema.
403ACCESS_PROFILE_UNMAPPEDConta sem Perfil de Acesso convertido.

PATCH /v1/users/me/password

Altera a senha da conta local. Contas Appwrite alteram a senha no provedor.

Autenticação e autorização: Bearer JWT próprio de Pessoa titular da conta local.

Entrada — JSON

LocalCampoTipoObrigatórioCondição
CorpocurrentPasswordstring, 1 a 72 caracteresSimSenha atual.
CorponewPasswordstring, 8 a 72 caracteresSimNova senha.

Saída

HTTPCampoTipoDescrição
204—sem corpoSenha alterada.

Erros

HTTPerrorCodeCondição
400VALIDATION_FAILEDCorpo inválido.
401UNAUTHORIZEDCredencial ausente ou inválida.
403FORBIDDENSenha atual incorreta, token de sistema ou conta Appwrite.

Tokens de sistema

POST /v1/auth/tokens

Emite token de máquina vinculado a um sistema habilitado. O segredo completo aparece somente nesta resposta. Cada item listado depois omite o segredo e seu hash.

Autenticação e autorização: Bearer de Pessoa com Acesso de Núcleo ou superior.

Entrada — JSON

LocalCampoTipoObrigatórioCondição
Corponamestring, até 120 caracteresSimNome não vazio.
CorposystemKeystringSimChave de sistema habilitado no catálogo.
Corposcopesarray de stringsNãoAté 32 escopos; reservados para autorização futura.
CorpoexpiresAtdata ISO 8601NãoData futura; omitida significa sem expiração.

Saída

HTTPCampoTipoDescrição
201idUUIDID do token.
201namestringNome informado.
201systemKeystringSistema vinculado.
201tokenstringSegredo completo no formato nhub_<id>.<segredo>.

Erros

HTTPerrorCodeCondição
400VALIDATION_FAILEDCorpo inválido, expiração passada ou sistema não habilitado.
401UNAUTHORIZEDCredencial ausente ou inválida.
403FORBIDDENToken de máquina ou perfil insuficiente.

GET /v1/auth/tokens

Lista os tokens do titular sem revelar segredos.

Autenticação e autorização: Bearer de Pessoa; token de sistema não acessa tokens pessoais.

Entrada

LocalCampoTipoObrigatórioCondição
CabeçalhoAuthorizationBearer JWTSimCredencial de Pessoa.
QuerycursorstringNãoCursor opaco da página anterior.
Querylimitinteiro de 1 a 200NãoPadrão: 50.

Saída

HTTPCampoTipoDescrição
200itemsarray de tokensTokens do titular; sem segredo nem hash.
200items[].idUUIDID do token.
200items[].namestringNome.
200items[].ownerIdUUIDTitular.
200items[].scopesarray de stringsEscopos declarados.
200items[].systemKeystring ou nullSistema vinculado; null em token legado.
200items[].expiresAtdata e hora ISO 8601 ou nullExpiração.
200items[].revokedAtdata e hora ISO 8601 ou nullRevogação.
200items[].lastUsedAtdata e hora ISO 8601 ou nullÚltimo uso registrado.
200items[].createdAtdata e hora ISO 8601Emissão.
200nextCursorstring ou nullnull indica fim da listagem.

Erros

HTTPerrorCodeCondição
400VALIDATION_FAILEDCursor malformado ou limite fora de 1 a 200.
401UNAUTHORIZEDCredencial ausente ou inválida.
403FORBIDDENToken de sistema.

DELETE /v1/auth/tokens/:id

Revoga token do próprio titular.

Autenticação e autorização: Bearer de Pessoa titular; token de sistema não revoga tokens pessoais.

Entrada

LocalCampoTipoObrigatórioCondição
CaminhoidUUIDSimID do token.
CabeçalhoAuthorizationBearer JWTSimCredencial de Pessoa.

Saída

HTTPCampoTipoDescrição
204—sem corpoToken revogado.

Erros

HTTPerrorCodeCondição
400VALIDATION_FAILEDID fora do formato UUID.
401UNAUTHORIZEDCredencial ausente ou inválida.
403FORBIDDENToken de sistema.
404NOT_FOUNDToken inexistente ou de outro titular.

Consulta de autorização

POST /v1/authorization/document-access

Informa se um usuário pode ler um documento. Uma negativa retorna allowed: false, sem revelar a existência do documento.

Autenticação e autorização: Bearer token de sistema. A resposta inclui Cache-Control: private, max-age=60.

Entrada — JSON

LocalCampoTipoObrigatórioCondição
CorpodocumentIdUUIDSimDocumento consultado.
CorpouserIdUUIDSimUsuário cuja leitura é avaliada.

Saída

HTTPCampoTipoDescrição
200allowedbooleanPermissão de leitura efetiva.

Erros

HTTPerrorCodeCondição
400VALIDATION_FAILEDID fora do formato UUID.
401UNAUTHORIZEDCredencial ausente ou inválida.
403FORBIDDENChamador autenticado como Pessoa.

Administração de contas

As respostas de conta omitem passwordHash, appwriteSubject, profile legado e a relação interna person.

GET /v1/users

Lista contas para administração. Exige Acesso Global ou superior.

Entrada

LocalCampoTipoObrigatórioCondição
QuerycursorstringNãoCursor opaco da página anterior.
Querylimitinteiro de 1 a 200NãoPadrão: 50.

Saída

HTTPCampoTipoDescrição
200itemsarray de contasContas da página.
200items[].idUUIDID da conta.
200items[].emailstringE-mail normalizado.
200items[].namestringNome de exibição.
200items[].accessProfilePerfil de Acesso ou nullPerfil da conta; null durante migração.
200items[].personIdUUID ou nullPessoa titular; null durante migração.
200items[].activebooleanEstado da conta.
200items[].createdAtdata e hora ISO 8601Criação.
200items[].updatedAtdata e hora ISO 8601Última atualização.
200nextCursorstring ou nullnull indica fim da lista.

Erros

HTTPerrorCodeCondição
400VALIDATION_FAILEDCursor ou limite inválido.
401UNAUTHORIZEDCredencial ausente ou inválida.
403FORBIDDENPerfil insuficiente.

POST /v1/users

Cria conta local para uma Pessoa física existente, sem provisionamento Appwrite. Exige Acesso Global ou superior.

Entrada — JSON

LocalCampoTipoObrigatórioCondição
CorpopersonIdUUIDSimPessoa física titular.
Corpoemaile-mail, até 254 caracteresSimE-mail normalizado.
Corponamestring, até 120 caracteresSimNome não vazio.
Corpopasswordstring, 8 a 72 caracteresSimSenha inicial local.
CorpoaccessProfilePerfil de AcessoSimPerfil da conta.

Saída

HTTPCampoTipoDescrição
201idUUIDID da conta.
201emailstringE-mail normalizado.
201namestringNome de exibição.
201accessProfilePerfil de Acesso ou nullPerfil da conta; null durante migração.
201personIdUUID ou nullPessoa titular; null durante migração.
201activebooleanEstado da conta.
201createdAtdata e hora ISO 8601Criação.
201updatedAtdata e hora ISO 8601Última atualização.

Erros

HTTPerrorCodeCondição
400VALIDATION_FAILEDCorpo inválido.
401UNAUTHORIZEDCredencial ausente ou inválida.
403FORBIDDENPerfil insuficiente.
409CONFLICTE-mail ou Pessoa já vinculados.
422RULE_VIOLATIONPessoa inexistente ou não física.

GET /v1/users/:id

Consulta a conta indicada. Acesso Global ou superior pode consultar outras contas; demais Pessoas consultam apenas a própria.

Entrada

LocalCampoTipoObrigatórioCondição
CaminhoidUUIDSimID da conta.

Saída

HTTPCampoTipoDescrição
200idUUIDID da conta.
200emailstringE-mail normalizado.
200namestringNome de exibição.
200accessProfilePerfil de Acesso ou nullPerfil da conta; null durante migração.
200personIdUUID ou nullPessoa titular; null durante migração.
200activebooleanEstado da conta.
200createdAtdata e hora ISO 8601Criação.
200updatedAtdata e hora ISO 8601Última atualização.

Erros

HTTPerrorCodeCondição
400VALIDATION_FAILEDID inválido.
401UNAUTHORIZEDCredencial ausente ou inválida.
403FORBIDDENSem acesso à conta de outra Pessoa.
404NOT_FOUNDConta inexistente.

PATCH /v1/users/:id

Atualiza uma conta. Exige Acesso Global ou superior.

Entrada — JSON

LocalCampoTipoObrigatórioCondição
CaminhoidUUIDSimConta alterada.
CorpopersonIdUUIDNãoPessoa física titular.
Corponamestring, até 120 caracteresNãoNome de exibição.
CorpoaccessProfilePerfil de AcessoNãoPerfil concedido.
CorpoactivebooleanNãofalse desativa a conta.

Saída

HTTPCampoTipoDescrição
200idUUIDID da conta.
200emailstringE-mail normalizado.
200namestringNome de exibição.
200accessProfilePerfil de Acesso ou nullPerfil da conta; null durante migração.
200personIdUUID ou nullPessoa titular; null durante migração.
200activebooleanEstado da conta.
200createdAtdata e hora ISO 8601Criação.
200updatedAtdata e hora ISO 8601Última atualização.

Erros

HTTPerrorCodeCondição
400VALIDATION_FAILEDID ou corpo inválido.
401UNAUTHORIZEDCredencial ausente ou inválida.
403FORBIDDENPerfil insuficiente.
404NOT_FOUNDConta inexistente.
409CONFLICTPessoa já vinculada.
422RULE_VIOLATIONPessoa inexistente ou não física.

Camadas do domínio