Create API Key
curl --request POST \
--url https://api.velt.dev/v2/workspace/apikey/create \
--header 'Content-Type: application/json' \
--header 'x-velt-workspace-auth-token: <x-velt-workspace-auth-token>' \
--header 'x-velt-workspace-id: <x-velt-workspace-id>' \
--data '
{
"data": {
"ownerEmail": "<string>",
"type": "<string>",
"persistenceDBRegion": "<string>",
"createAuthToken": true,
"apiKeyName": "<string>",
"allowedDomains": [
"<string>"
],
"addLocalHostToAllowedDomains": true,
"useEmailService": true,
"useWebhookService": true,
"useNotificationService": true,
"setDefaultNotificationTriggers": true,
"setDefaultEmailTriggers": true,
"requireAutoOrgUser": true,
"enablePrivateComments": true,
"emailServiceConfig": {
"type": "<string>",
"apiKey": "<string>",
"fromEmail": "<string>",
"fromCompany": "<string>",
"commentTemplateId": "<string>",
"tagTemplateId": "<string>"
},
"webhookServiceConfig": {
"authToken": "<string>",
"rawNotificationUrl": "<string>",
"processedNotificationUrl": "<string>"
}
}
}
'import requests
url = "https://api.velt.dev/v2/workspace/apikey/create"
payload = { "data": {
"ownerEmail": "<string>",
"type": "<string>",
"persistenceDBRegion": "<string>",
"createAuthToken": True,
"apiKeyName": "<string>",
"allowedDomains": ["<string>"],
"addLocalHostToAllowedDomains": True,
"useEmailService": True,
"useWebhookService": True,
"useNotificationService": True,
"setDefaultNotificationTriggers": True,
"setDefaultEmailTriggers": True,
"requireAutoOrgUser": True,
"enablePrivateComments": True,
"emailServiceConfig": {
"type": "<string>",
"apiKey": "<string>",
"fromEmail": "<string>",
"fromCompany": "<string>",
"commentTemplateId": "<string>",
"tagTemplateId": "<string>"
},
"webhookServiceConfig": {
"authToken": "<string>",
"rawNotificationUrl": "<string>",
"processedNotificationUrl": "<string>"
}
} }
headers = {
"x-velt-workspace-id": "<x-velt-workspace-id>",
"x-velt-workspace-auth-token": "<x-velt-workspace-auth-token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-velt-workspace-id': '<x-velt-workspace-id>',
'x-velt-workspace-auth-token': '<x-velt-workspace-auth-token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
data: {
ownerEmail: '<string>',
type: '<string>',
persistenceDBRegion: '<string>',
createAuthToken: true,
apiKeyName: '<string>',
allowedDomains: ['<string>'],
addLocalHostToAllowedDomains: true,
useEmailService: true,
useWebhookService: true,
useNotificationService: true,
setDefaultNotificationTriggers: true,
setDefaultEmailTriggers: true,
requireAutoOrgUser: true,
enablePrivateComments: true,
emailServiceConfig: {
type: '<string>',
apiKey: '<string>',
fromEmail: '<string>',
fromCompany: '<string>',
commentTemplateId: '<string>',
tagTemplateId: '<string>'
},
webhookServiceConfig: {
authToken: '<string>',
rawNotificationUrl: '<string>',
processedNotificationUrl: '<string>'
}
}
})
};
fetch('https://api.velt.dev/v2/workspace/apikey/create', 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.velt.dev/v2/workspace/apikey/create",
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([
'data' => [
'ownerEmail' => '<string>',
'type' => '<string>',
'persistenceDBRegion' => '<string>',
'createAuthToken' => true,
'apiKeyName' => '<string>',
'allowedDomains' => [
'<string>'
],
'addLocalHostToAllowedDomains' => true,
'useEmailService' => true,
'useWebhookService' => true,
'useNotificationService' => true,
'setDefaultNotificationTriggers' => true,
'setDefaultEmailTriggers' => true,
'requireAutoOrgUser' => true,
'enablePrivateComments' => true,
'emailServiceConfig' => [
'type' => '<string>',
'apiKey' => '<string>',
'fromEmail' => '<string>',
'fromCompany' => '<string>',
'commentTemplateId' => '<string>',
'tagTemplateId' => '<string>'
],
'webhookServiceConfig' => [
'authToken' => '<string>',
'rawNotificationUrl' => '<string>',
'processedNotificationUrl' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-velt-workspace-auth-token: <x-velt-workspace-auth-token>",
"x-velt-workspace-id: <x-velt-workspace-id>"
],
]);
$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.velt.dev/v2/workspace/apikey/create"
payload := strings.NewReader("{\n \"data\": {\n \"ownerEmail\": \"<string>\",\n \"type\": \"<string>\",\n \"persistenceDBRegion\": \"<string>\",\n \"createAuthToken\": true,\n \"apiKeyName\": \"<string>\",\n \"allowedDomains\": [\n \"<string>\"\n ],\n \"addLocalHostToAllowedDomains\": true,\n \"useEmailService\": true,\n \"useWebhookService\": true,\n \"useNotificationService\": true,\n \"setDefaultNotificationTriggers\": true,\n \"setDefaultEmailTriggers\": true,\n \"requireAutoOrgUser\": true,\n \"enablePrivateComments\": true,\n \"emailServiceConfig\": {\n \"type\": \"<string>\",\n \"apiKey\": \"<string>\",\n \"fromEmail\": \"<string>\",\n \"fromCompany\": \"<string>\",\n \"commentTemplateId\": \"<string>\",\n \"tagTemplateId\": \"<string>\"\n },\n \"webhookServiceConfig\": {\n \"authToken\": \"<string>\",\n \"rawNotificationUrl\": \"<string>\",\n \"processedNotificationUrl\": \"<string>\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-velt-workspace-id", "<x-velt-workspace-id>")
req.Header.Add("x-velt-workspace-auth-token", "<x-velt-workspace-auth-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.velt.dev/v2/workspace/apikey/create")
.header("x-velt-workspace-id", "<x-velt-workspace-id>")
.header("x-velt-workspace-auth-token", "<x-velt-workspace-auth-token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"ownerEmail\": \"<string>\",\n \"type\": \"<string>\",\n \"persistenceDBRegion\": \"<string>\",\n \"createAuthToken\": true,\n \"apiKeyName\": \"<string>\",\n \"allowedDomains\": [\n \"<string>\"\n ],\n \"addLocalHostToAllowedDomains\": true,\n \"useEmailService\": true,\n \"useWebhookService\": true,\n \"useNotificationService\": true,\n \"setDefaultNotificationTriggers\": true,\n \"setDefaultEmailTriggers\": true,\n \"requireAutoOrgUser\": true,\n \"enablePrivateComments\": true,\n \"emailServiceConfig\": {\n \"type\": \"<string>\",\n \"apiKey\": \"<string>\",\n \"fromEmail\": \"<string>\",\n \"fromCompany\": \"<string>\",\n \"commentTemplateId\": \"<string>\",\n \"tagTemplateId\": \"<string>\"\n },\n \"webhookServiceConfig\": {\n \"authToken\": \"<string>\",\n \"rawNotificationUrl\": \"<string>\",\n \"processedNotificationUrl\": \"<string>\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.velt.dev/v2/workspace/apikey/create")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-velt-workspace-id"] = '<x-velt-workspace-id>'
request["x-velt-workspace-auth-token"] = '<x-velt-workspace-auth-token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"ownerEmail\": \"<string>\",\n \"type\": \"<string>\",\n \"persistenceDBRegion\": \"<string>\",\n \"createAuthToken\": true,\n \"apiKeyName\": \"<string>\",\n \"allowedDomains\": [\n \"<string>\"\n ],\n \"addLocalHostToAllowedDomains\": true,\n \"useEmailService\": true,\n \"useWebhookService\": true,\n \"useNotificationService\": true,\n \"setDefaultNotificationTriggers\": true,\n \"setDefaultEmailTriggers\": true,\n \"requireAutoOrgUser\": true,\n \"enablePrivateComments\": true,\n \"emailServiceConfig\": {\n \"type\": \"<string>\",\n \"apiKey\": \"<string>\",\n \"fromEmail\": \"<string>\",\n \"fromCompany\": \"<string>\",\n \"commentTemplateId\": \"<string>\",\n \"tagTemplateId\": \"<string>\"\n },\n \"webhookServiceConfig\": {\n \"authToken\": \"<string>\",\n \"rawNotificationUrl\": \"<string>\",\n \"processedNotificationUrl\": \"<string>\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"result": {
"status": "success",
"message": "API key created successfully.",
"data": {
"apiKey": "your_new_api_key"
}
}
}
API Key Management
Create API Key
POST
/
v2
/
workspace
/
apikey
/
create
Create API Key
curl --request POST \
--url https://api.velt.dev/v2/workspace/apikey/create \
--header 'Content-Type: application/json' \
--header 'x-velt-workspace-auth-token: <x-velt-workspace-auth-token>' \
--header 'x-velt-workspace-id: <x-velt-workspace-id>' \
--data '
{
"data": {
"ownerEmail": "<string>",
"type": "<string>",
"persistenceDBRegion": "<string>",
"createAuthToken": true,
"apiKeyName": "<string>",
"allowedDomains": [
"<string>"
],
"addLocalHostToAllowedDomains": true,
"useEmailService": true,
"useWebhookService": true,
"useNotificationService": true,
"setDefaultNotificationTriggers": true,
"setDefaultEmailTriggers": true,
"requireAutoOrgUser": true,
"enablePrivateComments": true,
"emailServiceConfig": {
"type": "<string>",
"apiKey": "<string>",
"fromEmail": "<string>",
"fromCompany": "<string>",
"commentTemplateId": "<string>",
"tagTemplateId": "<string>"
},
"webhookServiceConfig": {
"authToken": "<string>",
"rawNotificationUrl": "<string>",
"processedNotificationUrl": "<string>"
}
}
}
'import requests
url = "https://api.velt.dev/v2/workspace/apikey/create"
payload = { "data": {
"ownerEmail": "<string>",
"type": "<string>",
"persistenceDBRegion": "<string>",
"createAuthToken": True,
"apiKeyName": "<string>",
"allowedDomains": ["<string>"],
"addLocalHostToAllowedDomains": True,
"useEmailService": True,
"useWebhookService": True,
"useNotificationService": True,
"setDefaultNotificationTriggers": True,
"setDefaultEmailTriggers": True,
"requireAutoOrgUser": True,
"enablePrivateComments": True,
"emailServiceConfig": {
"type": "<string>",
"apiKey": "<string>",
"fromEmail": "<string>",
"fromCompany": "<string>",
"commentTemplateId": "<string>",
"tagTemplateId": "<string>"
},
"webhookServiceConfig": {
"authToken": "<string>",
"rawNotificationUrl": "<string>",
"processedNotificationUrl": "<string>"
}
} }
headers = {
"x-velt-workspace-id": "<x-velt-workspace-id>",
"x-velt-workspace-auth-token": "<x-velt-workspace-auth-token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-velt-workspace-id': '<x-velt-workspace-id>',
'x-velt-workspace-auth-token': '<x-velt-workspace-auth-token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
data: {
ownerEmail: '<string>',
type: '<string>',
persistenceDBRegion: '<string>',
createAuthToken: true,
apiKeyName: '<string>',
allowedDomains: ['<string>'],
addLocalHostToAllowedDomains: true,
useEmailService: true,
useWebhookService: true,
useNotificationService: true,
setDefaultNotificationTriggers: true,
setDefaultEmailTriggers: true,
requireAutoOrgUser: true,
enablePrivateComments: true,
emailServiceConfig: {
type: '<string>',
apiKey: '<string>',
fromEmail: '<string>',
fromCompany: '<string>',
commentTemplateId: '<string>',
tagTemplateId: '<string>'
},
webhookServiceConfig: {
authToken: '<string>',
rawNotificationUrl: '<string>',
processedNotificationUrl: '<string>'
}
}
})
};
fetch('https://api.velt.dev/v2/workspace/apikey/create', 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.velt.dev/v2/workspace/apikey/create",
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([
'data' => [
'ownerEmail' => '<string>',
'type' => '<string>',
'persistenceDBRegion' => '<string>',
'createAuthToken' => true,
'apiKeyName' => '<string>',
'allowedDomains' => [
'<string>'
],
'addLocalHostToAllowedDomains' => true,
'useEmailService' => true,
'useWebhookService' => true,
'useNotificationService' => true,
'setDefaultNotificationTriggers' => true,
'setDefaultEmailTriggers' => true,
'requireAutoOrgUser' => true,
'enablePrivateComments' => true,
'emailServiceConfig' => [
'type' => '<string>',
'apiKey' => '<string>',
'fromEmail' => '<string>',
'fromCompany' => '<string>',
'commentTemplateId' => '<string>',
'tagTemplateId' => '<string>'
],
'webhookServiceConfig' => [
'authToken' => '<string>',
'rawNotificationUrl' => '<string>',
'processedNotificationUrl' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-velt-workspace-auth-token: <x-velt-workspace-auth-token>",
"x-velt-workspace-id: <x-velt-workspace-id>"
],
]);
$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.velt.dev/v2/workspace/apikey/create"
payload := strings.NewReader("{\n \"data\": {\n \"ownerEmail\": \"<string>\",\n \"type\": \"<string>\",\n \"persistenceDBRegion\": \"<string>\",\n \"createAuthToken\": true,\n \"apiKeyName\": \"<string>\",\n \"allowedDomains\": [\n \"<string>\"\n ],\n \"addLocalHostToAllowedDomains\": true,\n \"useEmailService\": true,\n \"useWebhookService\": true,\n \"useNotificationService\": true,\n \"setDefaultNotificationTriggers\": true,\n \"setDefaultEmailTriggers\": true,\n \"requireAutoOrgUser\": true,\n \"enablePrivateComments\": true,\n \"emailServiceConfig\": {\n \"type\": \"<string>\",\n \"apiKey\": \"<string>\",\n \"fromEmail\": \"<string>\",\n \"fromCompany\": \"<string>\",\n \"commentTemplateId\": \"<string>\",\n \"tagTemplateId\": \"<string>\"\n },\n \"webhookServiceConfig\": {\n \"authToken\": \"<string>\",\n \"rawNotificationUrl\": \"<string>\",\n \"processedNotificationUrl\": \"<string>\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-velt-workspace-id", "<x-velt-workspace-id>")
req.Header.Add("x-velt-workspace-auth-token", "<x-velt-workspace-auth-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.velt.dev/v2/workspace/apikey/create")
.header("x-velt-workspace-id", "<x-velt-workspace-id>")
.header("x-velt-workspace-auth-token", "<x-velt-workspace-auth-token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"ownerEmail\": \"<string>\",\n \"type\": \"<string>\",\n \"persistenceDBRegion\": \"<string>\",\n \"createAuthToken\": true,\n \"apiKeyName\": \"<string>\",\n \"allowedDomains\": [\n \"<string>\"\n ],\n \"addLocalHostToAllowedDomains\": true,\n \"useEmailService\": true,\n \"useWebhookService\": true,\n \"useNotificationService\": true,\n \"setDefaultNotificationTriggers\": true,\n \"setDefaultEmailTriggers\": true,\n \"requireAutoOrgUser\": true,\n \"enablePrivateComments\": true,\n \"emailServiceConfig\": {\n \"type\": \"<string>\",\n \"apiKey\": \"<string>\",\n \"fromEmail\": \"<string>\",\n \"fromCompany\": \"<string>\",\n \"commentTemplateId\": \"<string>\",\n \"tagTemplateId\": \"<string>\"\n },\n \"webhookServiceConfig\": {\n \"authToken\": \"<string>\",\n \"rawNotificationUrl\": \"<string>\",\n \"processedNotificationUrl\": \"<string>\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.velt.dev/v2/workspace/apikey/create")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-velt-workspace-id"] = '<x-velt-workspace-id>'
request["x-velt-workspace-auth-token"] = '<x-velt-workspace-auth-token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"ownerEmail\": \"<string>\",\n \"type\": \"<string>\",\n \"persistenceDBRegion\": \"<string>\",\n \"createAuthToken\": true,\n \"apiKeyName\": \"<string>\",\n \"allowedDomains\": [\n \"<string>\"\n ],\n \"addLocalHostToAllowedDomains\": true,\n \"useEmailService\": true,\n \"useWebhookService\": true,\n \"useNotificationService\": true,\n \"setDefaultNotificationTriggers\": true,\n \"setDefaultEmailTriggers\": true,\n \"requireAutoOrgUser\": true,\n \"enablePrivateComments\": true,\n \"emailServiceConfig\": {\n \"type\": \"<string>\",\n \"apiKey\": \"<string>\",\n \"fromEmail\": \"<string>\",\n \"fromCompany\": \"<string>\",\n \"commentTemplateId\": \"<string>\",\n \"tagTemplateId\": \"<string>\"\n },\n \"webhookServiceConfig\": {\n \"authToken\": \"<string>\",\n \"rawNotificationUrl\": \"<string>\",\n \"processedNotificationUrl\": \"<string>\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"result": {
"status": "success",
"message": "API key created successfully.",
"data": {
"apiKey": "your_new_api_key"
}
}
}
Use this API to create a new API key for a workspace.
This endpoint uses workspace-level auth: pass
x-velt-workspace-id and x-velt-workspace-auth-token (from the Create Workspace response) as headers.Creating a
production API key is gated. The workspace must be explicitly enabled for self‑serve production key creation and must already be on a paid plan. See Production API Keys below.Endpoint
POST https://api.velt.dev/v2/workspace/apikey/create
Headers
string
required
Your Workspace ID.
string
required
Your workspace Auth Token.
Body
Params
object
required
Show properties
Show properties
string
required
Email address of the API key owner. Must be a valid email.
string
required
API key type. Accepted values:
"testing" or "production".string
Provide this only for type:
"production". Accepts any supported region from Supported Regions.boolean
Whether to create an auth token along with the API key. Recommended:
true.string
Display name for the API key.
string[]
List of domains allowed to use this API key.
boolean
Whether to automatically add localhost to allowed domains.
boolean
Whether to enable the email service for this API key.
boolean
Whether to enable the webhook service for this API key.
boolean
Whether to enable the in‑app notification service for this API key.
boolean
Seed the default notification triggers when enabling the notification service.
boolean
Seed the default email triggers when enabling the email service.
boolean
Require auto‑creation of the organization user.
boolean
Initial value for the workspace‑scoped private comments feature flag. Defaults to
false when omitted.object
Configuration object for the email service. See Update Email Config for the full schema.
Show properties
Show properties
string
Email service provider type. Accepted values:
"default" or "sendgrid".string
API key for the email service provider (e.g., your SendGrid API key).
string
Sender email address.
string
Sender company name.
string
SendGrid template ID for comment notification emails.
string
SendGrid template ID for tag/mention notification emails.
object
Configuration object for the webhook service. See Update Webhook Config for the full schema.
Example Request
Testing key
{
"data": {
"ownerEmail": "owner@example.com",
"type": "testing",
"createAuthToken": true
}
}
Production key (default North America region)
{
"data": {
"ownerEmail": "owner@example.com",
"type": "production",
"apiKeyName": "Production Key",
"createAuthToken": true
}
}
Production key with region selection (Europe)
{
"data": {
"ownerEmail": "owner@example.com",
"type": "production",
"apiKeyName": "EU Production Key",
"persistenceDBRegion": "eur3",
"realtimeDBRegion": "europe-west1",
"createAuthToken": true
}
}
Example Response
Success Response
{
"result": {
"status": "success",
"message": "API key created successfully.",
"data": {
"apiKey": "your_new_api_key"
}
}
}
Failure Response
{
"error": {
"status": "INVALID_ARGUMENT",
"message": "ownerEmail is required."
}
}
Errors
| Status | When |
|---|---|
INVALID_ARGUMENT | Missing/invalid ownerEmail or type, or an unsupported persistenceDBRegion / realtimeDBRegion (including an explicit empty string). |
PERMISSION_DENIED | Invalid workspace credentials, or the workspace is not allowed to create production API keys. |
FAILED_PRECONDITION | Creating a production key but the workspace has not been upgraded to a paid plan. |
RESOURCE_EXHAUSTED | The workspace has reached its maximum number of production API keys. |
{
"result": {
"status": "success",
"message": "API key created successfully.",
"data": {
"apiKey": "your_new_api_key"
}
}
}
Was this page helpful?
⌘I

