Перейти к документации
PHP

API-ключи

`keys->list`, `listAll`, `iterate`, `get`, `create`, `update`, `delete`, `rotate` и `revoke`, а также методы чтения журнала запросов, активности и статистики.

Все методы

keys.php
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 удаляет только отозванный ключ: любой другой даёт 409 not_revoked, выбрасываемый как ConflictException. Для чтения нужна keys:read, а для любого изменения keys:manage.

list возвращает одну OpenEmail\Result\Page, listAll возвращает все ключи одним массивом, а iterate возвращает Generator, который выдаёт ключи по одному. create и update принимают тело одним массивом с именами из API, а revoke принимает необязательный массив с reason. Токен доступа OAuth получает доступ к этим вызовам, только если человек, подключивший приложение, владеет рабочим пространством. Токен любого другого человека получает PermissionException, у которого errorCode равно owner_only.

Пакет никогда не повторяет create или rotate. Повтор после потерянного ответа выпустил бы второй ключ или сделал бы недействительным секрет, который вернула первая попытка. update и revoke повторяются после сетевого сбоя, потому что их повтор оставляет тот же ключ, а delete не повторяется.

Никогда не шире вызывающего

Ключ никогда не создаёт ключ шире себя и не получает к нему доступа. Области, роль, срок действия, режим и область отправки должны укладываться в рамки вызывающего ключа, иначе вызов выбрасывает PermissionException, у которого errorCode равно beyond_caller_authority, а param называет ось. Ключ, суженный до некоторых доменов или адресов, видит только ключи в пределах собственной области отправки. rotate для вызывающего ключа работает и с keys:write, как $client->me->rotate().

Повторное подтверждение нельзя применить к вызову, сделанному ключом, поэтому keys:manage это доступ, который создаёт доступы. Давайте его только автоматизации, выпускающей ключи, дайте этому ключу роль, область отправки и срок действия и следите за listWorkspaceActivity, где всё, что он делает, записано на него.

Журнал запросов и активность

key_logs.php
$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:, в виде массива или одной строки через запятую. У каждого есть двойники listAll и iterate, например listAllRequests и iterateRequests. Они принимают since: и until: как DateTimeInterface или строку ISO 8601, а методы чтения запросов принимают также failedOnly:.

stats читает, что ключи делали за один период: отправленную ими почту и что с ней стало, отклонённые вызовы, сделанные ими запросы и маршруты, которые они вызывали. Он принимает те же keyIds:, since: и until:, а также grain: и offsetMinutes:, охватывает 30 дней до текущего момента, если период не указан, и требует emails:read вместе с keys:read.

until: должен быть позже since:, иначе вызов выбрасывает InvalidRequestException, у которого errorCode равно invalid_parameter, а param равно until. DateTimeInterface отправляется в UTC, а строка отправляется как написана, поэтому она должна быть меткой времени ISO 8601, например 2026-09-01T00:00:00Z.