Chaves API
`keys.list`, `list_all`, `iterate`, `get`, `create`, `update`, `delete`, `rotate` e `revoke`, e os leitores do registo de pedidos e da atividade.
Todos os métodos
from pathlib import Path from openemail import openemail key = openemail.keys.create({ 'name': 'Billing sender', 'scopes': ['emails:send'], 'domainAllowlist': ['billing.acme.com'], 'expiresInMinutes': 60 * 24 * 90,}) secret = Path('.openemail-billing-key')secret.touch(mode=0o600)secret.write_text(key['token']) openemail.keys.update(key['id'], {'enabled': False}) rotated = openemail.keys.rotate(key['id'])secret.write_text(rotated['token']) openemail.keys.revoke(key['id'], {'reason': 'Replaced'})openemail.keys.delete(key['id'])create e rotate são as únicas chamadas que devolvem um segredo, em token, uma vez. Cada leitura devolve maskedKey em vez disso. update desativa e ativa uma chave com enabled, a alternativa reversível a revoke, e delete só remove uma chave já revogada. Ler precisa de keys:read e cada alteração de keys:manage.
O cliente 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 como as leituras, 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: âmbitos, função, expiração, modo e âmbito de envio têm todos de ficar dentro da chave que chama, ou a chamada é recusada com 403 beyond_caller_authority. 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 chama também funciona com keys:write, como 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 list_workspace_activity, onde tudo o que ela faz fica registado em seu nome.
Registo de pedidos e atividade
from datetime import datetime, timedelta, timezone from openemail import openemail failures = openemail.keys.list_requests( '4c1b257a66287fd113bd89d0', failed_only=True, since=datetime.now(timezone.utc) - timedelta(days=1),)for request in failures['items']: print(request['status'], request['method'], request['path']) for change in openemail.keys.iterate_workspace_activity(): actor = change['actor'] print(change['keyName'], change['type'], actor['label'] if actor else None)list_requests e list_activity leem uma chave, list_workspace_requests e list_workspace_activity leem todas as chaves ou as que key_ids nomeia, e cada uma tem um list_all_… e um iterate_… ao lado. Aceitam since e until, e os leitores de pedidos aceitam também failed_only.
since e until aceitam um datetime ou uma string ISO 8601. Um datetime é enviado em UTC, e um sem fuso horário é primeiro lido como hora local.
Referência
keys.list()Referência completakeys.list_all()Referência completakeys.iterate()Referência completakeys.get()Referência completakeys.create()Referência completakeys.update()Referência completakeys.delete()Referência completakeys.rotate()Referência completakeys.revoke()Referência completakeys.list_requests()Referência completakeys.list_all_requests()Referência completakeys.iterate_requests()Referência completakeys.list_activity()Referência completakeys.list_all_activity()Referência completakeys.iterate_activity()Referência completakeys.list_workspace_requests()Referência completakeys.list_all_workspace_requests()Referência completakeys.iterate_workspace_requests()Referência completakeys.list_workspace_activity()Referência completakeys.list_all_workspace_activity()Referência completakeys.iterate_workspace_activity()Referência completa