Chaves API
`keys->list`, `listAll`, `iterate`, `get`, `create`, `update`, `delete`, `rotate` e `revoke`, e os leitores do registo de pedidos, da atividade e das estatísticas.
Todos os métodos
use OpenEmail\Constants\ApiScopes; $key = $client->keys->create([ 'name' => 'Billing sender', 'scopes' => [ApiScopes::EMAILS_SEND], 'domainAllowlist' => ['billing.acme.com'], 'expiresInMinutes' => 60 * 24 * 90,]); file_put_contents('.openemail-billing-key', $key['token']); $client->keys->update($key['id'], ['enabled' => false]); $rotated = $client->keys->rotate($key['id']);file_put_contents('.openemail-billing-key', $rotated['token']); $client->keys->revoke($key['id'], ['reason' => 'Replaced']);$client->keys->delete($key['id']);create e rotate são as únicas chamadas que devolvem um segredo, em token, uma única vez. Todas as leituras devolvem maskedKey em vez disso. update desativa e ativa uma chave com enabled, que é a alternativa reversível a revoke, e delete só remove uma chave já revogada: qualquer outra chave dá um 409 not_revoked, lançado como ConflictException. Ler precisa de keys:read e todas as alterações precisam de keys:manage.
list devolve uma OpenEmail\Result\Page, listAll devolve todas as chaves num único array, e iterate devolve um Generator que entrega uma chave de cada vez. create e update aceitam o corpo como um único array com os nomes da API, e revoke aceita um array opcional com reason. Um token de acesso OAuth só chega a estas chamadas quando a pessoa que ligou a aplicação é a proprietária do espaço de trabalho. O de qualquer outra pessoa recebe um PermissionException com errorCode definido como owner_only.
O pacote nunca repete create nem rotate. Uma repetição depois de uma resposta perdida criaria uma segunda chave, ou invalidaria o segredo que a primeira tentativa devolveu. update e revoke são repetidos após uma falha de rede, porque repeti-los deixa a mesma chave, e delete não.
Nunca mais ampla do que quem chama
Uma chave nunca cria nem alcança uma chave mais ampla do que ela própria. Os âmbitos, a função, a expiração, o modo e o âmbito de envio têm todos de ficar dentro da chave que faz a chamada, caso contrário a chamada lança um PermissionException com errorCode definido como beyond_caller_authority, e param indica o eixo. Uma chave restrita a alguns domínios ou endereços só vê as chaves dentro do seu próprio âmbito de envio. rotate sobre a chave que faz a chamada também funciona com keys:write, como $client->me->rotate().
A verificação adicional não se pode aplicar a uma chamada feita com uma chave, por isso keys:manage é uma credencial que cria credenciais. Dê-a apenas a uma automação que emite chaves, dê a essa chave uma função, um âmbito de envio e uma expiração, e acompanhe listWorkspaceActivity, onde tudo o que ela faz fica registado em seu nome.
Registo de pedidos e atividade
$failures = $client->keys->listRequests( '4c1b257a66287fd113bd89d0', failedOnly: true, since: new \DateTimeImmutable('-1 day'),);echo count($failures), PHP_EOL; foreach ($client->keys->iterateWorkspaceActivity() as $change) { echo $change['keyName'], ' ', $change['type'], ' ', $change['actor']['label'] ?? 'system', PHP_EOL;}listRequests e listActivity leem uma chave, e listWorkspaceRequests e listWorkspaceActivity leem todas as chaves ou as que keyIds: nomeia, como array ou como uma única string separada por vírgulas. Cada um tem ao lado um equivalente listAll e um iterate, como listAllRequests e iterateRequests. Aceitam since: e until: como DateTimeInterface ou string ISO 8601, e os leitores de pedidos aceitam também failedOnly:.
stats lê o que as chaves fizeram num período: o correio que enviaram e o que lhe aconteceu, as chamadas recusadas, os pedidos que fizeram e as rotas que chamaram. Aceita os mesmos keyIds:, since: e until:, mais grain: e offsetMinutes:, abrange os 30 dias até agora quando não indica nenhum período, e precisa de emails:read além de keys:read.
until: tem de ser posterior a since:, caso contrário a chamada lança um InvalidRequestException com errorCode definido como invalid_parameter e param definido como until. Um DateTimeInterface é enviado em UTC, e uma string é enviada tal como está escrita, por isso tem de ser um carimbo temporal ISO 8601 como 2026-09-01T00:00:00Z.