Skip to main content
POST
/
v1
/
keys
Create a virtual key with a budget
curl --request POST \
  --url https://api.example.com/v1/keys \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "label": "CI pipeline key",
  "budgetUsd": 50,
  "rpmLimit": 60,
  "tpmLimit": 100000,
  "ownerId": "<string>",
  "teamId": "<string>"
}
'
import requests

url = "https://api.example.com/v1/keys"

payload = {
"label": "CI pipeline key",
"budgetUsd": 50,
"rpmLimit": 60,
"tpmLimit": 100000,
"ownerId": "<string>",
"teamId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
label: 'CI pipeline key',
budgetUsd: 50,
rpmLimit: 60,
tpmLimit: 100000,
ownerId: '<string>',
teamId: '<string>'
})
};

fetch('https://api.example.com/v1/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.example.com/v1/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([
'label' => 'CI pipeline key',
'budgetUsd' => 50,
'rpmLimit' => 60,
'tpmLimit' => 100000,
'ownerId' => '<string>',
'teamId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);

$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.example.com/v1/keys"

payload := strings.NewReader("{\n \"label\": \"CI pipeline key\",\n \"budgetUsd\": 50,\n \"rpmLimit\": 60,\n \"tpmLimit\": 100000,\n \"ownerId\": \"<string>\",\n \"teamId\": \"<string>\"\n}")

req, _ := http.NewRequest("POST", url, payload)

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.example.com/v1/keys")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"label\": \"CI pipeline key\",\n \"budgetUsd\": 50,\n \"rpmLimit\": 60,\n \"tpmLimit\": 100000,\n \"ownerId\": \"<string>\",\n \"teamId\": \"<string>\"\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.example.com/v1/keys")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"label\": \"CI pipeline key\",\n \"budgetUsd\": 50,\n \"rpmLimit\": 60,\n \"tpmLimit\": 100000,\n \"ownerId\": \"<string>\",\n \"teamId\": \"<string>\"\n}"

response = http.request(request)
puts response.read_body

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Body

application/json
label
string
required
Example:

"CI pipeline key"

keyClass
enum<string>
required
Available options:
interactive,
ci
budgetUsd
number
required

Monthly budget in USD

Example:

50

rpmLimit
number | null

Max requests per minute. null or 0 = unlimited.

Example:

60

tpmLimit
number | null

Max tokens per minute. null or 0 = unlimited.

Example:

100000

ownerId
string | null

User who owns/uses this key. Must belong to the caller’s tenant. Omitted or null = ownerless (CI/service key).

teamId
string | null

Cost-center team this key bills to. Must belong to the caller’s tenant. When omitted and ownerId is set, defaults to that owner’s current team. Explicit null = unassigned (no team).

Response

201

Key created — rawKey shown once