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
Your Workspace ID.
Your workspace Auth Token.
Body
Params
Show properties
Show properties
Email address of the API key owner. Must be a valid email.
API key type. Accepted values:
"testing" or "production".Provide this only for type:
"production". Accepts any supported region from Supported Regions.Whether to create an auth token along with the API key. Recommended:
true.Display name for the API key.
List of domains allowed to use this API key.
Whether to automatically add localhost to allowed domains.
Whether to enable the email service for this API key.
Whether to enable the webhook service for this API key.
Whether to enable the in‑app notification service for this API key.
Seed the default notification triggers when enabling the notification service.
Seed the default email triggers when enabling the email service.
Require auto‑creation of the organization user.
Initial value for the workspace‑scoped private comments feature flag. Defaults to
false when omitted.Configuration object for the email service. See Update Email Config for the full schema.
Show properties
Show properties
Email service provider type. Accepted values:
"default" or "sendgrid".API key for the email service provider (e.g., your SendGrid API key).
Sender email address.
Sender company name.
SendGrid template ID for comment notification emails.
SendGrid template ID for tag/mention notification emails.
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

