API 키
`keys->list`, `listAll`, `iterate`, `get`, `create`, `update`, `delete`, `rotate`, `revoke`, 그리고 요청 로그, 활동, 통계를 읽는 메서드.
모든 메서드
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와 rotate뿐이며, token으로 한 번만 돌려줍니다. 모든 읽기는 대신 maskedKey를 돌려줍니다. update는 enabled로 키를 끄고 켜는데, 이는 revoke의 되돌릴 수 있는 대안이며, delete는 폐기된 키만 없앱니다: 그 밖의 키는 ConflictException으로 던져지는 409 not_revoked입니다. 읽기에는 keys:read, 모든 변경에는 keys:manage가 필요합니다.
list는 OpenEmail\Result\Page 하나를 반환하고, listAll은 모든 키를 하나의 배열로 반환하며, iterate는 키를 하나씩 yield하는 Generator를 반환합니다. create와 update는 본문을 API의 이름을 쓰는 배열 하나로 받고, revoke는 reason을 담은 선택적 배열을 받습니다. OAuth 액세스 토큰은 앱을 연결한 사람이 워크스페이스 소유자일 때만 이 호출에 닿습니다. 그 밖의 사람의 토큰은 errorCode가 owner_only로 설정된 PermissionException을 받습니다.
패키지는 create나 rotate를 절대 재시도하지 않습니다. 응답을 잃은 뒤 재시도하면 두 번째 키가 발급되거나, 첫 시도가 돌려준 시크릿이 무효가 되기 때문입니다. update와 revoke는 반복해도 같은 키가 남으므로 네트워크 장애 후에 재시도되지만, delete는 재시도되지 않습니다.
호출자보다 넓지 않게
키는 자신보다 넓은 키를 만들거나 그런 키에 닿지 않습니다. 스코프, 역할, 만료, 모드, 발신 범위가 모두 호출하는 키 안에 있어야 하며, 그렇지 않으면 호출은 errorCode가 beyond_caller_authority로 설정된 PermissionException을 던지고 param이 그 축을 알려 줍니다. 일부 도메인이나 주소로 좁혀진 키는 자기 발신 범위 안의 키만 봅니다. 호출하는 키 자신에 대한 rotate는 $client->me->rotate()처럼 keys:write로도 됩니다.
재인증은 키로 한 호출에는 적용할 수 없으므로 keys:manage는 자격 증명을 만들어 내는 자격 증명입니다. 키를 발급하는 자동화에만 주고, 그 키에 역할·발신 범위·만료를 주고, 그 모든 행동이 기록되는 listWorkspaceActivity를 지켜보세요.
요청 로그와 활동
$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와 listActivity는 키 하나를, listWorkspaceRequests와 listWorkspaceActivity는 모든 키나 keyIds:로 지정한 키를 읽으며, 이 값은 배열이나 쉼표로 구분한 문자열 하나로 줍니다. 각각 옆에 listAllRequests와 iterateRequests처럼 listAll과 iterate로 시작하는 짝이 있습니다. since:와 until:을 DateTimeInterface나 ISO 8601 문자열로 받으며, 요청을 읽는 메서드는 failedOnly:도 받습니다.
stats는 한 기간 안에 키가 한 일을 읽습니다: 보낸 메일과 그 메일이 어떻게 되었는지, 거부된 호출, 보낸 요청, 호출한 경로입니다. 같은 keyIds:, since:, until:에 더해 grain:과 offsetMinutes:를 받고, 기간을 지정하지 않으면 지금까지의 30일을 다루며, keys:read와 함께 emails:read가 필요합니다.
until:은 since:보다 뒤여야 하며, 그렇지 않으면 호출은 errorCode가 invalid_parameter이고 param이 until로 설정된 InvalidRequestException을 던집니다. DateTimeInterface는 UTC로 전송되고 문자열은 쓰인 그대로 전송되므로, 문자열은 2026-09-01T00:00:00Z 같은 ISO 8601 타임스탬프여야 합니다.