Admin API do espaço de trabalho
A Admin API do espaço de trabalho permite a integrações entre servidores administrar um espaço EVCharge. Esta documentação destina-se a administradores de espaços de trabalho e integradores externos da API. Usa tokens de acesso revogáveis, vinculados ao espaço de trabalho e com âmbitos detalhados; não aceita tokens de início de sessão de clientes nem sessões de navegador.
Este diretório é a referência canónica para programadores da API /v2/admin implementada por app-api. Não documenta rotas de clientes/móveis nem as rotas HTTP próprias do portal de administração.
- Pedidos e respostas dos endpoints lista todos os 87 endpoints registados, âmbitos, parâmetros, corpos de pedido e corpos de sucesso.
- Esquemas e exemplos define os tipos reutilizáveis de pedido/resposta e conteúdos JSON representativos.
- Contrato de respostas e erros define todos os corpos de insucesso comuns e específicos de endpoints.
URL base e limite dos recursos
Todas as rotas são relativas à origem app-api implementada:
https://api.evcharge.mobi/v2/admin/...
O ID do espaço de trabalho não é aceite no URL, na cadeia de consulta nem no corpo do pedido. Cada token de acesso está vinculado a exatamente um espaço de trabalho, e a API obtém cpoId da identidade autenticada do token. Se um local, carregador, utilizador, tarifa, perfil, atribuição ou transação aninhado não pertencer a esse espaço, a API devolve a mesma resposta 404 RESOURCE_NOT_FOUND, sem permitir descobrir a existência de recursos.
Obter um token de acesso
Um administrador do espaço de trabalho cria tokens nas Definições do espaço de trabalho, em Acesso à API. A gestão de tokens não é intencionalmente disponibilizada aos tokens do espaço de trabalho.
- O acesso à API está incluído em todos os planos, incluindo o Free. O administrador tem de ter permissão para editar o espaço de trabalho.
- O anfitrião do espaço de trabalho tem de ativar a Admin API através de
adminApiEnabled; caso contrário, um token válido recebe uma resposta404que não revela a existência de recursos a partir deapp-api. - O administrador só pode conceder âmbitos permitidos pelas suas permissões atuais e pelos direitos do espaço de trabalho.
- Os novos tokens podem não expirar (predefinição das Definições do espaço de trabalho) ou ter uma duração de 1 a 365 dias inteiros selecionada pelo administrador; o servidor calcula as datas de expiração absolutas finitas. Os tokens sem expiração mantêm-se válidos até serem revogados.
- Um espaço de trabalho pode ter, no máximo, 50 tokens ativos.
- A credencial em texto simples é mostrada uma vez. Guarde-a imediatamente num gestor de segredos.
- O nome, os âmbitos e a validade são imutáveis. Para rodar o token, crie um substituto, implemente-o, verifique-o e revogue o antigo.
- A revogação é imediata; as linhas revogadas continuam visíveis como histórico imutável do espaço de trabalho com dados sensíveis ocultos, e não existe endpoint de introspeção do bearer token nem de eliminação definitiva.
app-api não tem um endpoint para emitir, renovar, listar ou revogar estas credenciais. Obter o token é, por isso, um pré-requisito realizado através do portal de administração humano, não outro endpoint desta referência.
Nunca coloque o token no controlo de versões, URLs, cadeias de consulta, cookies, registos, análises ou relatórios de erros.
Autenticação
Envie exatamente um cabeçalho no estilo RFC 6750 em cada pedido:
Authorization: Bearer evc_ws_<selector>.<secret>
A credencial opaca exata é evc_ws_, seguida de um seletor base64url canónico de 16 caracteres, . e um segredo base64url canónico de 43 caracteres. Envie a credencial completa sem alterações; não volte a codificá-la em base64.
A API rejeita cabeçalhos de autorização duplicados, valores unidos por vírgulas, outros esquemas, valores bearer vazios, JWTs de clientes e credenciais fornecidas fora deste cabeçalho.
Tokens malformados, desconhecidos, expirados, revogados ou inválidos por outro motivo recebem a mesma resposta:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer
Cache-Control: no-store
Content-Type: application/json
{
"error": "Unauthorized",
"code": "INVALID_WORKSPACE_TOKEN"
}
O serviço verifica o estado do token e os direitos atuais do espaço de trabalho em cada pedido. Remover um direito pode, assim, desativar os âmbitos afetados antes da expiração do token.
Os tokens de espaço de trabalho são credenciais opacas, não JWTs. Não têm token de renovação e não existe endpoint de renovação. Um token finito deixa de autenticar no seu expiresAt absoluto; um token sem expiração mantém-se válido até ser revogado. A rotação consiste em criar uma credencial de substituição no portal, implementá-la no cliente e revogar a antiga.
Convenções dos pedidos
- Use
Content-Type: application/jsonnos pedidos com corpo JSON. - Os valores opcionais
X-Request-Iddo pedido são aparados e aceites apenas se contiverem entre 1 e 128 caracteres deA-Z,a-z,0-9,.,_,:ou-; caso contrário, o servidor gera um UUID. Todas as respostas devolvem o valor selecionado comoX-Request-Id. - O
X-Error-Format: envelopeopcional converte todas as respostas de erro JSON para o envelope estruturado documentado no Contrato de respostas e erros. Qualquer outro valor preserva o corpo de compatibilidade predefinido. - Os IDs nos parâmetros de caminho são inteiros positivos. Os IDs de tokens de acesso devolvidos pelo portal são cadeias decimais, pois são valores de base de dados de 64 bits sem sinal.
- Os valores de data e hora são cadeias RFC 3339 com desvio explícito, por exemplo
2026-08-13T12:30:00Z. - As eliminações bem-sucedidas normalmente devolvem
204 No Content. - As operações de criação normalmente devolvem
201 Created. - O trabalho OCPP apenas colocado em fila pode devolver
202 Accepted; não o interprete como confirmação do carregador, salvo indicação explícita da resposta. - As respostas autenticadas usam
Cache-Control: no-store. Os endpoints de QR e exportação de relatórios devolvem corpos binários com cabeçalhos de conteúdo explícitos. - As origens de navegador permitidas podem ler
X-Request-Id,Idempotency-Replayed,Retry-AftereContent-Dispositionatravés de CORS. Isto permite correlacionar pedidos, detetar repetições idempotentes, respeitar os tempos de nova tentativa e manter os nomes de ficheiro de transferência escolhidos pelo servidor.
Idempotência
Todos os pedidos administrativos POST, PUT, PATCH e DELETE têm de incluir um cabeçalho Idempotency-Key. As chaves contêm entre 1 e 255 caracteres visíveis e são limitadas ao token, método e caminho.
Idempotency-Key: provisioning-2026-08-13-site-42
Reutilizar uma chave concluída com o mesmo URL e corpo repete a resposta guardada e acrescenta:
Idempotency-Replayed: true
Reutilizar uma chave com um pedido diferente devolve 409 IDEMPOTENCY_CONFLICT. Um pedido ainda em processamento devolve 409 IDEMPOTENT_REQUEST_PROCESSING com Retry-After: 5.
As respostas concluídas e os resultados terminais são mantidos para repetição ou reconciliação durante sete dias após a última atualização. Depois desse período, a mesma chave pode ser tratada como um novo comando, pelo que os clientes têm de usar chaves globalmente únicas e não as devem reutilizar intencionalmente.
Se a concessão de processamento expirar, a ligação fechar após o início da execução ou a operação devolver um erro de servidor, a API não consegue provar com segurança se ocorreu um efeito externo. Durante os sete dias de retenção, a chave fica definitivamente indeterminada e devolve 409 IDEMPOTENCY_OUTCOME_UNKNOWN; não é recuperada nem executada automaticamente de novo. Verifique os efeitos antes de recuperar manualmente e não envie a mesma operação com uma nova chave até concluir a reconciliação.
Todos os endpoints administrativos que alteram dados, incluindo POST /reports/send, exigem Idempotency-Key.
Limites de pedidos
Os limites aplicam-se ao token individual e ao respetivo espaço de trabalho. As predefinições no repositório são:
| Limite | Predefinição |
|---|---|
| Janela | 60 segundos |
| Por token | 300 pedidos |
| Por espaço de trabalho | 1 000 pedidos |
Um pedido limitado devolve 429 Too Many Requests e um cabeçalho Retry-After. As implementações podem substituir estes valores.
Erros
Os erros JSON usam um code estável quando o cliente precisa de distinguir casos:
{
"error": "Insufficient workspace-token scope",
"code": "INSUFFICIENT_SCOPE"
}
Os erros de validação usam arrays de campos:
{
"validationErrors": {
"name": ["String must contain at least 1 character(s)"]
}
}
Os estados comuns são:
| Estado | Significado |
|---|---|
400 | Contrato de idempotência/cursor de utilizadores/geocodificador inválido; as falhas de esquema de caminho/corpo/consulta são normalmente 422 |
401 | Token do espaço de trabalho inválido |
403 | Token válido sem o âmbito efetivo ou direito exigido |
404 | O espaço de trabalho ou recurso aninhado não é visível para este token |
409 | Conflito de estado de recurso, dependência, concorrência ou idempotência |
422 | Falha de validação de campo, intervalo limitado ou limite de exportação |
429 | Limite de pedidos do token ou espaço de trabalho excedido |
502 | Uma operação subsequente, como a entrega de um relatório, falhou |
503 | O armazenamento de autorização ou idempotência está temporariamente indisponível |
Catálogo de âmbitos
O catálogo de âmbitos seguinte é usado quando um administrador cria um token. Um âmbito de escrita ou de elevado impacto pode implicar o âmbito de leitura correspondente, mas âmbitos de leitura nunca concedem escrita. Os âmbitos disponíveis dependem das permissões do administrador e das funções ativadas no espaço de trabalho.
| Domínio | Âmbitos de leitura | Âmbitos de escrita e de elevado impacto | Direito adicional, quando aplicável |
|---|---|---|---|
| Espaço de trabalho | workspaces:read | workspaces:update | — |
| Locais | sites:read | sites:create, sites:update, sites:delete, sites:power-management | dlmPowerManagement para gestão de potência |
| Carregadores | chargers:read | chargers:create, chargers:update, chargers:delete, chargers:credentials, chargers:configuration, chargers:firmware, chargers:commands, chargers:public, chargers:connector-settings, chargers:local-users, chargers:tariff-assignments, chargers:profile-assignments | firmwareOperations, publicCharging, tariffs ou smartCharging para a capacidade correspondente |
| Utilizadores | users:read | users:create, users:update, users:delete, users:invitations, users:rfid, users:access, users:limits | — |
| Perfis de carregamento | chargingProfiles:read | chargingProfiles:create, chargingProfiles:update, chargingProfiles:delete, chargingProfiles:assign | smartCharging |
| Tarifas | tariffs:read | tariffs:create, tariffs:update, tariffs:delete, tariffs:components, tariffs:assign | tariffs |
| Relatórios | reports:read | reports:export, reports:schedules, reports:send | scheduledReports para agendamentos e envio imediato |
O próprio acesso à API está incluído em todos os planos e é controlado pela definição adminApiEnabled do anfitrião. Os direitos de funções adicionais acima continuam a aplicar-se; o acesso à API não concede funções fora do plano do espaço de trabalho.
Referência de endpoints
As tabelas abaixo listam todas as 87 rotas de administração do espaço de trabalho. Todos os âmbitos de uma célula são obrigatórios.
Espaço de trabalho
| Método | Caminho | Âmbito obrigatório | Finalidade |
|---|---|---|---|
GET | /v2/admin | workspaces:read | Lê metadados seguros e dados de referência do espaço de trabalho. |
PATCH | /v2/admin | workspaces:update | Atualiza um ou mais campos de metadados do espaço de trabalho. |
GET | /v2/admin/dashboard | workspaces:read + reports:read | Lê contagens limitadas do espaço de trabalho e agregados operacionais de 90 dias. |
Campos de atualização parcial do espaço de trabalho: name, email, website, addressLine1, addressLine2, postalCode, city, state e countryId. É obrigatório pelo menos um campo. As cadeias vazias que permitem null são normalizadas para null.
Locais e gestão de potência
| Método | Caminho | Âmbito obrigatório | Finalidade |
|---|---|---|---|
GET | /v2/admin/sites | sites:read | Lista locais com resumos limitados de 90 dias e dados de referência de locais. |
GET | /v2/admin/sites/geocode | sites:read | Procura candidatos normalizados de moradas de locais através do geocodificador partilhado com limitação de frequência e cache. |
POST | /v2/admin/sites | sites:create | Crie um local. |
GET | /v2/admin/sites/:siteId | sites:read + reports:read | Lê detalhes do local, sessões recentes, totais e agregados operacionais. |
PATCH | /v2/admin/sites/:siteId | sites:update | Substitui o documento editável do local. |
DELETE | /v2/admin/sites/:siteId | sites:delete | Elimina um local vazio; as dependências devolvem um conflito. |
GET | /v2/admin/sites/:siteId/power-management | sites:power-management | Lê a árvore de gestão dinâmica de carga do local. |
PUT | /v2/admin/sites/:siteId/power-management | sites:power-management | Substitui atomicamente a configuração de gestão de potência do local. |
Os corpos de criação e atualização parcial de locais usam:
{
"name": "Main depot",
"description": null,
"addressLine1": "1 Example Street",
"addressLine2": null,
"postalCode": "LV-1001",
"city": "Riga",
"state": null,
"countryId": 1,
"timezoneId": 1,
"latitude": 56.9496,
"longitude": 24.1052
}
A geocodificação de locais aceita os campos de consulta opcionais street, city, state, country e countryCode de duas letras, mais o cabeçalho Accept-Language. A pesquisa combinada de rua/cidade/estado tem de conter pelo menos dois caracteres. As respostas contêm apenas placeId, displayName, latitude e longitude; não são expostas credenciais nem metadados específicos do fornecedor. O servidor aplica a fila partilhada de um pedido por segundo, tempo limite de oito segundos, cache limitada de 24 horas e limites globais de pedidos dos tokens do espaço de trabalho.
A gestão de potência aceita { "pools": [...] }. Um grupo tem id, name, limit, meterSources opcional e children recursivos. Um carregador subordinado tem chargepointId e priority. A API limita a árvore e o número de contadores e executa limpeza OCPP e revalidação em duas fases ao substituir o estado instalado. Uma alteração recusada, com tempo esgotado ou em conflito concorrente devolve 409 POWER_MANAGEMENT_CONFLICT, preservando a configuração anterior.
Carregadores
| Método | Caminho | Âmbito obrigatório | Finalidade ou entrada |
|---|---|---|---|
GET | /v2/admin/chargers | chargers:read | Lista carregadores com estado e resumos limitados de energia/custo. |
POST | /v2/admin/chargers | chargers:create | Cria a partir de name, identifier e siteId, com password opcional. |
GET | /v2/admin/chargers/:chargerId | chargers:read | Lê dados de carregadores, EVSE, conectores, referência e estado. |
PATCH | /v2/admin/chargers/:chargerId | chargers:update | Atualiza name, siteId, invertedRfid, smartMode ou automationDisabled. |
DELETE | /v2/admin/chargers/:chargerId | chargers:delete | Elimina um carregador de acordo com as regras de dependência e faturação. |
PATCH | /v2/admin/chargers/:chargerId/credentials | chargers:credentials | Substitui a palavra-passe do carregador por { "password": "..." }. |
PATCH | /v2/admin/chargers/:chargerId/connectors/:portId | chargers:connector-settings | Atualiza o formato/tipo de conector, tipo de alimentação, tensão, corrente e limites de potência. |
PATCH | /v2/admin/chargers/:chargerId/public-listing | chargers:public | Defina `{ "isPublic": true |
GET | /v2/admin/chargers/:chargerId/public-readiness | chargers:read | Lê a prontidão do carregamento público e os requisitos em falta. |
GET | /v2/admin/chargers/:chargerId/logs | chargers:read | Lê registos OCPP expurgados com paginação por cursor. |
GET | /v2/admin/chargers/:chargerId/sessions | chargers:read + reports:read | Lê sessões de carregamento paginadas e totais. |
GET | /v2/admin/chargers/:chargerId/qr | chargers:read | Gera um QR PNG de 300 píxeis; connector=0..255 opcional. |
GET | /v2/admin/chargers/:chargerId/composite-schedules | chargers:read | Lê o histórico persistido de agendamentos compostos. |
GET | /v2/admin/chargers/:chargerId/configuration | chargers:read | Lê a configuração OCPP com os valores sensíveis ocultos. |
PATCH | /v2/admin/chargers/:chargerId/configuration | chargers:configuration | Envia uma alteração de configuração com key e value. |
POST | /v2/admin/chargers/:chargerId/configuration/reload | chargers:configuration | Pede uma nova configuração do carregador. |
GET | /v2/admin/chargers/:chargerId/firmware | chargers:read | Lê o firmware atual e o estado de atualização. |
POST | /v2/admin/chargers/:chargerId/firmware | chargers:firmware | Coloca em fila uma atualização a partir de um { "url": "..." } HTTP(S). |
POST | /v2/admin/chargers/:chargerId/commands/reset | chargers:commands | Envie `{ "resetType": "Soft" |
POST | /v2/admin/chargers/:chargerId/commands/availability | chargers:commands | Envie `{ "availabilityType": "Operative" |
POST | /v2/admin/chargers/:chargerId/commands/trigger | chargers:commands | Aciona BootNotification, Heartbeat, StatusNotification ou MeterValues. |
POST | /v2/admin/chargers/:chargerId/commands/unlock | chargers:commands | Desbloqueia um connectorId positivo. |
POST | /v2/admin/chargers/:chargerId/commands/composite-schedule | chargers:commands | Pede um agendamento composto para connectorId, durationSeconds e chargingRateUnit. |
Os parâmetros de consulta dos registos do carregador são cursor, limit (predefinição 50, máximo 200), from, to, action, direction e levelId. Os parâmetros de sessões são page, limit (predefinição 25, máximo 100), from, to e customerId (um ID positivo ou unknown). O histórico de agendamentos compostos usa cursor, limit (predefinição 20, máximo 50) e connectorId opcional.
Relatórios
| Método | Caminho | Âmbito obrigatório | Finalidade |
|---|---|---|---|
GET | /v2/admin/reports/data | reports:read | Lê dados filtrados de relatórios de sessões com paginação por cursor. |
GET | /v2/admin/reports/measurements | reports:read | Lê valores de medição limitados de uma transação pertencente ao espaço de trabalho. |
GET | /v2/admin/reports/export | reports:export | Descarregue uma exportação CSV ou PDF. |
GET | /v2/admin/reports/schedule | reports:read | Lê o agendamento de exportação pertencente ao espaço de trabalho, ou null. |
PUT | /v2/admin/reports/schedule | reports:schedules | Cria ou substitui o agendamento de exportação pertencente ao espaço de trabalho. |
POST | /v2/admin/reports/send | reports:send | Envia por email a exportação guardada do mês civil UTC anterior; exige chave de idempotência. |
Os filtros dos dados e da exportação de relatórios são from, to, siteId, chargerId, userId, anonymous e active. from/to usam, por predefinição, os últimos 90 dias e não podem abranger mais de 90 dias. userId não pode ser combinado com anonymous=true.
- Paginação dos dados:
cursoropaco, predefiniçãolimit=50, máximo 100. - Medições:
transactionLogIdobrigatório,cursoropaco, predefiniçãolimit=500, máximo 1 000. - Exportação:
format=csv|pdf, predefiniçãocsv, limite rígido de 2 000 linhas. - As respostas de exportação usam
Content-Disposition: attachment,Cache-Control: private, no-storeeX-Content-Type-Options: nosniff.
Corpo do agendamento:
{
"enabled": true,
"recipientEmail": "reports@example.com",
"format": "csv",
"sendDay": 5,
"sendTime": "08:30"
}
sendDay é de 1 a 28 e sendTime é interpretado em UTC. O agendador recupera um minuto agendado perdido durante o mês de entrega atual. As preparações que falham antes da entrega repetem após 5 e 10 minutos, uma reserva building interrompida pode ser recuperada após 30 minutos e o envio automático para após três tentativas. O agendador persiste indeterminate imediatamente antes da entrega SMTP; tanto indeterminate como o estado antigo sending são terminais, pois repetir automaticamente qualquer um pode enviar um anexo duplicado. Os operadores têm de reconciliar estes resultados manualmente antes de alterar o estado do agendamento. Cada ciclo seleciona, no máximo, dez agendamentos, deixa de iniciar trabalho após um orçamento de 45 segundos e usa tempos limite SMTP limitados. A tarefa está desativada por predefinição e tem de ser ativada explicitamente após validar SMTP e capacidade. O agendamento da API pertence ao espaço de trabalho, não usando a identidade da pessoa que criou o token.
Tarifas
| Método | Caminho | Âmbito obrigatório | Finalidade |
|---|---|---|---|
GET | /v2/admin/tariffs | tariffs:read | Lista tarifas e dados de referência. |
POST | /v2/admin/tariffs | tariffs:create | Crie uma tarifa. |
GET | /v2/admin/tariffs/:tariffId | tariffs:read | Lê uma tarifa pertencente ao espaço de trabalho e os respetivos componentes. |
PATCH | /v2/admin/tariffs/:tariffId | tariffs:update | Atualiza a definição da tarifa. |
PUT | /v2/admin/tariffs/:tariffId/components | tariffs:components | Substitui atomicamente até 256 componentes. |
DELETE | /v2/admin/tariffs/:tariffId | tariffs:delete | Elimina uma tarifa não utilizada. |
GET | /v2/admin/tariffs/:tariffId/market-prices | tariffs:read | Lê preços da zona de ofertas pertencente à tarifa a partir de startsAt numérico. |
GET | /v2/admin/chargers/:chargerId/tariff-assignments | chargers:tariff-assignments + tariffs:read | Lista atribuições de tarifas do carregador. |
POST | /v2/admin/chargers/:chargerId/tariff-assignments | chargers:tariff-assignments + tariffs:assign | Atribua uma tarifa. |
PATCH | /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentId | chargers:tariff-assignments + tariffs:assign | Substitui o destino de uma atribuição. |
DELETE | /v2/admin/chargers/:chargerId/tariff-assignments/:assignmentId | chargers:tariff-assignments + tariffs:assign | Remove uma atribuição. |
O corpo de uma tarifa contém name, exatamente um de currencyId, currencyCode ou currency, biddingZoneId opcional e tax. O corpo de uma atribuição é:
{ "tariffId": 17, "connectorId": 0 }
Ao criar uma atribuição, a tarifa aplica-se a todos os conectores físicos se connectorId for omitido ou definido explicitamente como 0. As atualizações visam uma atribuição persistida e, por isso, exigem um connectorId físico positivo explícito; 0 é rejeitado.
Um componente contém typeId, seasonId, price, priority opcional e limites de validade opcionais por mês, dia da semana e hora.
Perfis de carregamento
| Método | Caminho | Âmbito obrigatório | Finalidade |
|---|---|---|---|
GET | /v2/admin/charging-profiles | chargingProfiles:read | Lista perfis e dados de referência pertencentes ao espaço de trabalho. |
POST | /v2/admin/charging-profiles | chargingProfiles:create | Cria um perfil com agendamento opcional. |
GET | /v2/admin/charging-profiles/:profileId | chargingProfiles:read | Lê um perfil pertencente ao espaço de trabalho. |
PATCH | /v2/admin/charging-profiles/:profileId | chargingProfiles:update | Substitui os metadados do perfil. |
PUT | /v2/admin/charging-profiles/:profileId/schedule | chargingProfiles:update | Substitui o agendamento por 1 a 256 períodos. |
DELETE | /v2/admin/charging-profiles/:profileId | chargingProfiles:delete | Limpa as atribuições instaladas e elimina apenas após resultados OCPP aceites e revalidação. |
GET | /v2/admin/chargers/:chargerId/profile-assignments | chargers:profile-assignments + chargingProfiles:read | Lista atribuições de perfis do carregador. |
POST | /v2/admin/chargers/:chargerId/profile-assignments | chargers:profile-assignments + chargingProfiles:assign | Atribui e sincroniza um perfil. |
PATCH | /v2/admin/chargers/:chargerId/profile-assignments/:assignmentId | chargers:profile-assignments + chargingProfiles:assign | Substitui e sincroniza uma atribuição. |
DELETE | /v2/admin/chargers/:chargerId/profile-assignments/:assignmentId | chargers:profile-assignments + chargingProfiles:assign | Limpa e remove uma atribuição. |
Os campos de metadados do perfil são label, locationId, stackLevel, purposeId, kindId, recurrencyKindId opcional, validFrom, validTo, startSchedule, rateUnitId e minChargingRate opcional. Um período do agendamento contém startPeriod, limit e numberOfPhases opcional. Um corpo de atribuição contém profileId e connectorId (predefinição 0).
As eliminações de perfis e a substituição da gestão de potência podem aguardar a confirmação do carregador. Uma rejeição, tempo esgotado ou alteração concorrente de estado devolve um conflito e mantém a configuração na base de dados, em vez de fingir que o carregador foi limpo.
Utilizadores, convites, RFID, acesso e limites
| Método | Caminho | Âmbito obrigatório | Finalidade |
|---|---|---|---|
GET | /v2/admin/users | users:read | Lista membros e convites. |
POST | /v2/admin/users | users:create | Associa um cliente já registado através de email e do name do espaço de trabalho. |
POST | /v2/admin/users/invitations | users:invitations + users:access; também users:rfid quando é fornecido RFID | Convida um email desconhecido ou associa um cliente existente. |
POST | /v2/admin/users/invitations/resend | users:invitations | Reenvia através de { "email": "..." }, sujeito ao período de espera do destinatário. |
DELETE | /v2/admin/users/invitations | users:invitations | Cancela um convite; o email mantém-se no corpo JSON. |
GET | /v2/admin/users/:userId | users:read + reports:read | Lê detalhes do utilizador e totais limitados de sessões. |
PATCH | /v2/admin/users/:userId | users:update | Define o name de apresentação específico do espaço de trabalho. |
DELETE | /v2/admin/users/:userId | users:delete | Remove o membro e o respetivo acesso ao espaço de trabalho, sujeito a conflitos. |
GET | /v2/admin/users/:userId/vehicles | users:read | Lista veículos pertencentes ao espaço de trabalho. |
GET | /v2/admin/users/:userId/rfids | users:read | Lista metadados RFID com UIDs mascarados. |
POST | /v2/admin/users/:userId/rfids | users:rfid | Adiciona uid e name opcional; as respostas expõem apenas o UID mascarado. |
PATCH | /v2/admin/users/:userId/rfids/:rfidId | users:rfid | Atualiza a etiqueta RFID. |
DELETE | /v2/admin/users/:userId/rfids/:rfidId | users:rfid | Elimina um RFID e sincroniza os carregadores afetados. |
GET | /v2/admin/users/:userId/access | users:read | Lê autorizações de acesso ao carregador. |
PUT | /v2/admin/users/:userId/access | users:access | Substitui o acesso através de allChargers e chargerIds único. |
DELETE | /v2/admin/users/:userId/access/:accessId | users:access | Revoga uma linha de acesso. |
GET | /v2/admin/users/:userId/limits | users:read | Lista limites de carregamento. |
POST | /v2/admin/users/:userId/limits | users:limits | Cria limitTypeId, energyValue e/ou timeValue. |
PATCH | /v2/admin/users/:userId/limits/:limitId | users:limits | Atualiza um ou mais campos de limite. |
DELETE | /v2/admin/users/:userId/limits/:limitId | users:limits | Elimina um limite. |
GET | /v2/admin/chargers/:chargerId/local-users | chargers:read + users:read | Lista utilizadores locais do carregador e convites pendentes. |
POST | /v2/admin/chargers/:chargerId/local-users | chargers:local-users + users:access | Adiciona um customerId existente com expiresAt opcional. |
POST | /v2/admin/chargers/:chargerId/local-users/invitations | chargers:local-users + users:invitations + users:access | Adicione ou convide por email. |
DELETE | /v2/admin/chargers/:chargerId/local-users/invitations | chargers:local-users + users:invitations | Cancela um convite de utilizador local por email. |
PATCH | /v2/admin/chargers/:chargerId/local-users/:localUserId | chargers:local-users + users:access | Define expiresAt que permite null. |
DELETE | /v2/admin/chargers/:chargerId/local-users/:localUserId | chargers:local-users + users:access | Remove o acesso local e sincroniza o estado OCPP. |
A paginação de veículos e de utilizadores status=members usa um cursor numérico positivo. As páginas de convites usam um cursor i2.* opaco, enquanto status=all usa um cursor composto a2.* opaco após a primeira página (um cursor numérico só continua válido como continuação do fluxo de membros antigo). A pesquisa de utilizadores é enviada no cabeçalho X-Admin-User-Search para evitar colocar emails nos URLs ou registos de acesso. limit tem predefinição 50 e máximo 100; a lista de utilizadores suporta status=all|members|invitations. Trate todos os cursores devolvidos como opacos e devolva-os inalterados.
A criação direta de utilizadores não cria uma palavra-passe, identidade de início de sessão ou sessão. Apenas associa um cliente já registado. Para um email desconhecido, use o endpoint de convite. O utilizador de sistema Tagless protegido não pode ser alterado através destas rotas.
Exemplos
Defina valores na shell sem imprimir o token:
export ADMIN_API_BASE_URL="https://api.example.com"
export WORKSPACE_TOKEN="<read from secret manager>"
Listar locais:
curl --fail-with-body \
-H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
"${ADMIN_API_BASE_URL}/v2/admin/sites"
Crie um local em segurança:
curl --fail-with-body \
-X POST \
-H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: site-main-depot-v1" \
--data '{
"name":"Main depot",
"description":null,
"addressLine1":"1 Example Street",
"addressLine2":null,
"postalCode":"LV-1001",
"city":"Riga",
"state":null,
"countryId":1,
"timezoneId":1,
"latitude":56.9496,
"longitude":24.1052
}' \
"${ADMIN_API_BASE_URL}/v2/admin/sites"
Descarregue um relatório CSV para um intervalo UTC explícito:
curl --fail-with-body \
-H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
-o report.csv \
"${ADMIN_API_BASE_URL}/v2/admin/reports/export?format=csv&from=2026-07-01T00%3A00%3A00Z&to=2026-08-01T00%3A00%3A00Z"
Exclusões deliberadas
A API com tokens de espaço de trabalho não expõe operações que exigem uma identidade humana ou autoridade mais ampla. Estas incluem:
- criar, revelar, rodar ou revogar tokens com outro token;
- início de sessão, reposição de palavra-passe, sessões, delegação de funções ou privilégios humanos e alterações de propriedade do espaço de trabalho;
- criação/eliminação de espaços de trabalho e associação a contas de faturação;
- definições de pagamento, adesão Stripe, planos, faturas e faturação do anfitrião;
- operações de suporte ao nível do anfitrião e webhooks de fornecedores;
- notificações para pessoas, redirecionamentos de navegação, recursos de marca e rotas de desenvolvimento/teste.