curl --request POST \
--url https://flows.super.ai/api/service-accounts/{service_account_id}/api-keys \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "API Key",
"description": "API key for external integrations",
"scopes": [
"mcp"
]
}
'import requests
url = "https://flows.super.ai/api/service-accounts/{service_account_id}/api-keys"
payload = {
"name": "API Key",
"description": "API key for external integrations",
"scopes": ["mcp"]
}
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({
name: 'API Key',
description: 'API key for external integrations',
scopes: ['mcp']
})
};
fetch('https://flows.super.ai/api/service-accounts/{service_account_id}/api-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://flows.super.ai/api/service-accounts/{service_account_id}/api-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' => 'API Key',
'description' => 'API key for external integrations',
'scopes' => [
'mcp'
]
]),
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://flows.super.ai/api/service-accounts/{service_account_id}/api-keys"
payload := strings.NewReader("{\n \"name\": \"API Key\",\n \"description\": \"API key for external integrations\",\n \"scopes\": [\n \"mcp\"\n ]\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://flows.super.ai/api/service-accounts/{service_account_id}/api-keys")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"API Key\",\n \"description\": \"API key for external integrations\",\n \"scopes\": [\n \"mcp\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://flows.super.ai/api/service-accounts/{service_account_id}/api-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 \"name\": \"API Key\",\n \"description\": \"API key for external integrations\",\n \"scopes\": [\n \"mcp\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"modified_by": "<string>",
"name": "<string>",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"token": "saf_org_550e8400_abc123def456ghi789jkl012mno345pqr678stu901vwx234yz",
"token_prefix": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"description": "<string>",
"scopes": [
"mcp"
],
"service_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}Create an API key for a service account
Create a new API key for a specific service account.
Creates a new API key associated with the specified service account and returns the full authentication token. Important: The full token is only shown once during creation. Store it securely.
Context:
- The user must have access to the service account
- Optional
scopeslimits the surfaces the key may call:["mcp"]mints an MCP-only key that gets 403api_key_scopeon REST paths; omit for every surface - A caller authenticated with a scoped API key may only create keys within its
own scopes (403
api_key_scopeotherwise) - System accounts are not visible to API users due to RLS restrictions
- All accessible service accounts are organization accounts
- Uses ‘organization_service_account’ identity type
Related Endpoints:
- GET /service-accounts//api-keys - List API keys for a service account
- GET /service-accounts/ - Get service account details
curl --request POST \
--url https://flows.super.ai/api/service-accounts/{service_account_id}/api-keys \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "API Key",
"description": "API key for external integrations",
"scopes": [
"mcp"
]
}
'import requests
url = "https://flows.super.ai/api/service-accounts/{service_account_id}/api-keys"
payload = {
"name": "API Key",
"description": "API key for external integrations",
"scopes": ["mcp"]
}
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({
name: 'API Key',
description: 'API key for external integrations',
scopes: ['mcp']
})
};
fetch('https://flows.super.ai/api/service-accounts/{service_account_id}/api-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://flows.super.ai/api/service-accounts/{service_account_id}/api-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' => 'API Key',
'description' => 'API key for external integrations',
'scopes' => [
'mcp'
]
]),
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://flows.super.ai/api/service-accounts/{service_account_id}/api-keys"
payload := strings.NewReader("{\n \"name\": \"API Key\",\n \"description\": \"API key for external integrations\",\n \"scopes\": [\n \"mcp\"\n ]\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://flows.super.ai/api/service-accounts/{service_account_id}/api-keys")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"API Key\",\n \"description\": \"API key for external integrations\",\n \"scopes\": [\n \"mcp\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://flows.super.ai/api/service-accounts/{service_account_id}/api-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 \"name\": \"API Key\",\n \"description\": \"API key for external integrations\",\n \"scopes\": [\n \"mcp\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"created_at": "2023-11-07T05:31:56Z",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"modified_by": "<string>",
"name": "<string>",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"token": "saf_org_550e8400_abc123def456ghi789jkl012mno345pqr678stu901vwx234yz",
"token_prefix": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"description": "<string>",
"scopes": [
"mcp"
],
"service_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}Authorizations
JWT Bearer token authentication. Include your access token in the Authorization header as: Bearer YOUR_ACCESS_TOKEN
Example:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Path Parameters
UUID of the service account to create an API key for
Body
Public API request payload for creating a new API key.
Human-readable name for this API key.
255"API Key"
Optional description explaining the purpose and usage of this API key.
"API key for external integrations"
Surfaces this API key may call. 'mcp' allows the MCP server at /mcp/v2; 'api' allows the REST API. The legacy MCP server at /mcp exposes REST operations as tools, so it needs both. NULL (the default) allows every surface. A call outside the key's scopes gets 403 with error code 'api_key_scope': an MCP-only key (['mcp']) on any REST path or on /mcp. Allowed values: 'mcp', 'api'. Omit for every surface; an empty list is rejected. Scopes cannot be changed after creation.
1A surface an API key may call.
mcp, api ["mcp"]
Response
API key created successfully
Response model for API key creation including the full token.
Full authentication token. This is the only time the full token is shown. Store it securely as it cannot be retrieved later.
"saf_org_550e8400_abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
Surfaces this API key may call. 'mcp' allows the MCP server at /mcp/v2; 'api' allows the REST API. The legacy MCP server at /mcp exposes REST operations as tools, so it needs both. NULL (the default) allows every surface. A call outside the key's scopes gets 403 with error code 'api_key_scope': an MCP-only key (['mcp']) on any REST path or on /mcp.
A surface an API key may call.
mcp, api ["mcp"]