curl --request POST \
--url https://api.photon.codes/v1/account/service-keys \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"name": "<string>",
"expiresAt": "2030-01-01T00:00:00Z"
}
'import requests
url = "https://api.photon.codes/v1/account/service-keys"
payload = {
"name": "<string>",
"expiresAt": "2030-01-01T00:00:00Z"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({name: '<string>', expiresAt: '2030-01-01T00:00:00Z'})
};
fetch('https://api.photon.codes/v1/account/service-keys', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.photon.codes/v1/account/service-keys",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'expiresAt' => '2030-01-01T00:00:00Z'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.photon.codes/v1/account/service-keys"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"expiresAt\": \"2030-01-01T00:00:00Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.photon.codes/v1/account/service-keys")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"expiresAt\": \"2030-01-01T00:00:00Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.photon.codes/v1/account/service-keys")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"expiresAt\": \"2030-01-01T00:00:00Z\"\n}"
response = http.request(request)
puts response.read_body{
"secret": "<string>",
"serviceKey": {
"accountId": "<string>",
"createdAt": "2026-01-01T00:00:00.000Z",
"expiresAt": "2026-01-01T00:00:00.000Z",
"name": "<string>",
"revokedAt": "2026-01-01T00:00:00.000Z",
"serviceKeyId": "<string>"
}
}{
"code": "INVALID_ARGUMENT",
"status": 400,
"title": "Invalid Argument",
"type": "https://photon.codes/docs/problems/invalid-argument"
}{
"code": "NOT_AUTHENTICATED",
"status": 401,
"title": "Not Authenticated",
"type": "https://photon.codes/docs/problems/not-authenticated"
}{
"code": "FORBIDDEN",
"status": 403,
"title": "Forbidden",
"type": "https://photon.codes/docs/problems/forbidden"
}{
"code": "ACCOUNT_NOT_FOUND",
"status": 404,
"title": "Account Not Found",
"type": "https://photon.codes/docs/problems/account-not-found"
}{
"code": "ACCOUNT_SERVICE_KEY_LIMIT_REACHED",
"status": 409,
"title": "Account Service Key Limit Reached",
"type": "https://photon.codes/docs/problems/account-service-key-limit-reached"
}{
"code": "ACCOUNT_DELETED",
"status": 410,
"title": "Account Deleted",
"type": "https://photon.codes/docs/problems/account-deleted"
}{
"code": "PAYLOAD_TOO_LARGE",
"status": 413,
"title": "Payload Too Large",
"type": "https://photon.codes/docs/problems/payload-too-large"
}{
"code": "IDEMPOTENCY_KEY_REUSED",
"status": 422,
"title": "Idempotency Key Reused",
"type": "https://photon.codes/docs/problems/idempotency-key-reused"
}{
"code": "INTERNAL_ERROR",
"status": 500,
"title": "Internal Server Error",
"type": "https://photon.codes/docs/problems/internal-error"
}{
"code": "UPSTREAM_FAILURE",
"status": 502,
"title": "Upstream Service Failure",
"type": "https://photon.codes/docs/problems/upstream-failure"
}{
"code": "UPSTREAM_UNAVAILABLE",
"status": 503,
"title": "Upstream Service Unavailable",
"type": "https://photon.codes/docs/problems/upstream-unavailable"
}{
"code": "UPSTREAM_TIMEOUT",
"status": 504,
"title": "Upstream Service Timeout",
"type": "https://photon.codes/docs/problems/upstream-timeout"
}Create Account Service Key
Creates a service key for the authenticated account with the supplied name and optional expiresAt. Returns key metadata and a one-time credential; store the credential securely because it cannot be retrieved through the listing endpoint. These credentials act as the account and must not be distributed as project-scoped keys. Supply the required Idempotency-Key header.
curl --request POST \
--url https://api.photon.codes/v1/account/service-keys \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"name": "<string>",
"expiresAt": "2030-01-01T00:00:00Z"
}
'import requests
url = "https://api.photon.codes/v1/account/service-keys"
payload = {
"name": "<string>",
"expiresAt": "2030-01-01T00:00:00Z"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({name: '<string>', expiresAt: '2030-01-01T00:00:00Z'})
};
fetch('https://api.photon.codes/v1/account/service-keys', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.photon.codes/v1/account/service-keys",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'expiresAt' => '2030-01-01T00:00:00Z'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.photon.codes/v1/account/service-keys"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"expiresAt\": \"2030-01-01T00:00:00Z\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.photon.codes/v1/account/service-keys")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"expiresAt\": \"2030-01-01T00:00:00Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.photon.codes/v1/account/service-keys")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"expiresAt\": \"2030-01-01T00:00:00Z\"\n}"
response = http.request(request)
puts response.read_body{
"secret": "<string>",
"serviceKey": {
"accountId": "<string>",
"createdAt": "2026-01-01T00:00:00.000Z",
"expiresAt": "2026-01-01T00:00:00.000Z",
"name": "<string>",
"revokedAt": "2026-01-01T00:00:00.000Z",
"serviceKeyId": "<string>"
}
}{
"code": "INVALID_ARGUMENT",
"status": 400,
"title": "Invalid Argument",
"type": "https://photon.codes/docs/problems/invalid-argument"
}{
"code": "NOT_AUTHENTICATED",
"status": 401,
"title": "Not Authenticated",
"type": "https://photon.codes/docs/problems/not-authenticated"
}{
"code": "FORBIDDEN",
"status": 403,
"title": "Forbidden",
"type": "https://photon.codes/docs/problems/forbidden"
}{
"code": "ACCOUNT_NOT_FOUND",
"status": 404,
"title": "Account Not Found",
"type": "https://photon.codes/docs/problems/account-not-found"
}{
"code": "ACCOUNT_SERVICE_KEY_LIMIT_REACHED",
"status": 409,
"title": "Account Service Key Limit Reached",
"type": "https://photon.codes/docs/problems/account-service-key-limit-reached"
}{
"code": "ACCOUNT_DELETED",
"status": 410,
"title": "Account Deleted",
"type": "https://photon.codes/docs/problems/account-deleted"
}{
"code": "PAYLOAD_TOO_LARGE",
"status": 413,
"title": "Payload Too Large",
"type": "https://photon.codes/docs/problems/payload-too-large"
}{
"code": "IDEMPOTENCY_KEY_REUSED",
"status": 422,
"title": "Idempotency Key Reused",
"type": "https://photon.codes/docs/problems/idempotency-key-reused"
}{
"code": "INTERNAL_ERROR",
"status": 500,
"title": "Internal Server Error",
"type": "https://photon.codes/docs/problems/internal-error"
}{
"code": "UPSTREAM_FAILURE",
"status": 502,
"title": "Upstream Service Failure",
"type": "https://photon.codes/docs/problems/upstream-failure"
}{
"code": "UPSTREAM_UNAVAILABLE",
"status": 503,
"title": "Upstream Service Unavailable",
"type": "https://photon.codes/docs/problems/upstream-unavailable"
}{
"code": "UPSTREAM_TIMEOUT",
"status": 504,
"title": "Upstream Service Timeout",
"type": "https://photon.codes/docs/problems/upstream-timeout"
}Authorizations
Account Service Key, prefixed with pho_ask_, sent as Authorization: Bearer <key>. Acts on behalf of its owning account, subject to the permissions and credential restrictions of each operation. Account access tokens and OAuth grants also use the Bearer header. In organizations that require SSO, Account Service Keys are not accepted for managing the organization's SSO settings, deleting the organization, or checking whether it can be deleted.
Headers
Identifies one logical mutation across retries.
1 - 255^[\x21-\x7e]{1,255}$Body
1 - 128^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$"2030-01-01T00:00:00Z"
Was this page helpful?